class A
{
void fun1()
{
System.out.println(fun2());
}
int fun2()
{
return 123;
}
}
class B extends A
{
int fun2()
{
return 456;
}
public static void main(String argv[])
{
A a;
B b = new B();
b.fun1();
a = b;
a.fun1();
}
}
分析过程:
A a;定义一个引用类型的变量a,并未初始化该变量。
B b = new B();创建一个B对象,B类是A类的子类,根据Java中的继承关系,B类将获得A类中的所以成员属性(处了私有属性外)。
执行b.fun1();时,A类的fun1方法调用了fun2方法,而fun2在子类B中重写了该方法,所以将会打印出456。
a=b;这时将b对象赋值给a对象,父类的引用指向子类对象,将存在多态。
因为子类其实是一种特殊的父类,因为Java允许把一个子类对象直接赋给一个父类引用变量,无须任何类型转换,或者被称为向上转型,向上转型是由系统自动完成的。
Java引用变量有两个类型,一个是编译时的类型,一个是运行时的类型。编译时的类型是由声明该变量时使用的类型决定,运行时类型由实际赋给该变量的对象决定。如果编译时类型和运行时类型不一致,就会出现所谓的多态。
在编译时fun2方法应该加载的是父类的fun2方法,当运行时,因为子类B重写了父类的fun2方法,所以在运行时将执行子类的fun2
所以这里也会打印出456、