class PolyBase ...{
public PolyBase() ...{
System.out.println("PolyBase");
}
int a = 1;
double d = 2.0;
void show() ...{
System.out.println("PolyBase A: a=" + a + " b=" + d);
}
}
public class PolySub extends PolyBase ...{
public PolySub() ...{
System.out.println("PolySub");
}
float a = 3.0f;
String d = "java prog";
void show() ...{
super.show();
System.out.println("PolySub b=" + a + " d=" + d);
}
public static void main(String[] args) ...{
PolyBase b=new PolySub();
System.out.println(b.a);
b.show();
}
}
public PolyBase() ...{
System.out.println("PolyBase");
}
int a = 1;
double d = 2.0;
void show() ...{
System.out.println("PolyBase A: a=" + a + " b=" + d);
}
}
public class PolySub extends PolyBase ...{
public PolySub() ...{
System.out.println("PolySub");
}
float a = 3.0f;
String d = "java prog";
void show() ...{
super.show();
System.out.println("PolySub b=" + a + " d=" + d);
}
public static void main(String[] args) ...{
PolyBase b=new PolySub();
System.out.println(b.a);
b.show();
}
}
A b = new B(); 这条语句,实际上有三个过程:
(1) A b;
将b声明为父类对象,只是一个引用,未分配空间
(2) B temp = new B();
通过B类的构造函数建立了一个B类对象的实例,也就是初始化
(3) a = (A)temp;
将子类对象temp转换未父类对象并赋给b,这就是上传(upcast),是安全的。
经过以上3个过程,b就彻底成为了一个A类的实例。
子类往往比父类有更多的属性和方法,上传只是舍弃,是安全的;而下传(downcast)有时会增加,通常是不安全的,不过上传会重写A的方法,多态的特性。
父类的属性不能被子类覆盖,而父类的方法可以被子类覆盖,因此b.a输出的是父类的属性,而b.show()调用的则是子类的方法。
OUTPUT:
PolyBase
PolySub
1
PolyBase A: a=1 b=2.0
PolySub b=3.0 d=java prog