楼主可以看看下面的代码和注释,这是父类引用指向子类对象的多态的各种情况的展示,楼主可以根据输出的结果判断准确性
class Fu
{
static int num = 5;
void method1()
{
System.out.println("fu method_1");
}
void method2()
{
System.out.println("fu method_2");
}
static void method4()
{
System.out.println("fu method_4");
}
}
class Zi extends Fu
{
static int num = 8;
void method1()
{
System.out.println("zi method_1");
}
void method3()
{
System.out.println("zi method_3");
}
static void method4()
{
System.out.println("zi method_4");
}
}
class DuoTaiDemo4
{
public static void main(String[] args)
{
//此处为父类引用指向子类对象的多态形式
Fu f = new Zi();
/*
多态情况下调用非静态方法的时候是编译时看左边的引用即父类引用中是否有该方法,
没有则编译失败,但是如果父类中有该方法,被子类复写后,运行时为子类结果,
简单而言就是编译时看左边,运行时看右边.
对于静态方法,静态变量及非静态变量而言,编译和运行都是看父类引用的,也就是说如果
父类中有该方法或变量,编译则会通过,运行时也是父类中的方法或变量,否则编译失败。
因此此处的输出语句输出的应为父类中num值,即为5
*/
System.out.println(f.num);
/*
method1方法父类子类中都有,子类复写了父类中的该方法,而对于非静态方法而言,编译
时看左边,运行时看右边,因此该句调用的应为子类的method1方法
*/
f.method1();
/*
method2方法父类中有,子类中没有复写该方法,因此子类当中默认的还是父类中的method2方法
对于非静态成员方法而言,编译时看左边,运行时看右边,该句调用的应为子类的method2方法,因为
没有复写该方法,因此默认是子类的该方法是直接继承自父类的
*/
f.method2();
/*
此处应该编译失败,原因是非静态方法编译时看的是父类引用当中是否有该方法,没有则会编译失败
如果想调用子类中特有的method3方法,只能通过强制类型转换,即
Zi z = (Zi)f;
z.method3();
*/
f.method3();
/*
对于此处的method4,因为为静态方法,编译和运行时都应该看的是左边,即父类中的方法,因此
此处相当于调用了父类中的method4方法
*/
f.method4();
}
}
|