public class MainTest { static class A { public int i; public void f() { System.out.println("AAAAA"); } } static class B extends A { public void f() { System.out.println("BBBBB"); } public void g() { System.out.println("GGGG"); } } public static void main(String[] args) { A a1 = new B();// 正确,子类对象赋值给父类引用 // B b1 = (B) new A();// 错误,父类对象不能直接赋值给子类引用 A a2 = new B(); a2.i = 1; // 正确,访问父类属性 a2.f(); // 正确,访问子类重写的父类的子类方法 // a2.g(); // 错误,不能访问子类中特有的方法 A a3 = new A(); B b3 = new B(); // b3 = (B) a3;// 错误,父类引用指向的是父类对象,不能强制转换为子类引用。 A a4 = new B(); B b4 = new B(); b4 = (B) a4;// 正确,此时父类引用指向的是子类对象。可以强制转换为子类引用,必须得使用强转, } }
1)子类对象可以直接赋值给父类引用,但父类对象不能直接赋值给子类引用。因为子类可以看作一个特殊的父类,即为父类的一种,但是父类在任何情况下都不能当作一个子类。例如:狗是动物的子
类,狗可以看作一种动物,但是动物不一定是狗。
A a1 = new B();//正确,子类对象赋值给父类引用
B b1 = new A();//错误,父类对象不能直接赋值给子类引用
2)父类引用指向子类对象的引用类型只能访问父类的一些属性和方法,无法访问子类特有的属性和方法。
A a2 = new B();
a2.i = 1; //正确,访问父类属性
a2.f(); //正确,访问子类重写的父类的子类方法
a2.g(); //错误,不能访问子类中特有的方法
3)当父类引用指向一个子类对象时,才可以把父类引用强制转换为子类引用。
A a3 = new A();
B b3 = new B();
b3 = (B)a3;//错误,父类引用指向的是父类对象,不能强制转换为子类引用。
A a4 = new B();
B b4 = new B();
b4 = (B)a4;//正确,此时父类引用指向的是子类对象。可以强制转换为子类引用,但是必须使用强制转换
博客大部分来自网络,如有涉及到版权问题请联系本人删除或修改,博客内容主要为自己学习和笔记使用并希望能给有需要的朋友提供一些帮助,不喜勿喷,欢迎各位指出错误,一起学习、进步。
联系邮箱:[email protected]
QQ:1129368407