1.代码理解
class A
{
}
class B extends A
{
}
class Test
{
public static void main(String[] args)
{
A a1 = new A();
B b1 = new B();
//b1 = a1; //error,子类引用不能直接赋给父类引用
b1 = (B)a1; /*编译不会报错,运行会报错,说明语法没问题
但a引用实际上还是指向A类对象,这样赋值依旧会出问题*/
}
}
结果:Exception in thread "main" java.lang.ClassCastException: A cannot be cast to B
class A
{
}
class B extends A
{
}
class Test
{
public static void main(String[] args)
{
A a1 = new A();
B b1 = new B();
a1 = b1; //a1指向B类对象,或者A a1 = new B()
b1 = (B)a1; //此时不会报错,因为a1指向的是B类的对象,(B)不可省略
}
}
2.多态注意事项总结
- 子类对象引用可以直接赋给父类引用,但父类引用不能直接赋给子类引用。
- 通过父类引用只能访问从父类继承过来的成员,不能访问子类独有的成员。
- 只有在父类引用本身指向子类对象时,才可以把父类引用强制转化为子类引用。其他情况下,把父类引用强制转化子类引用,运行时会报错。