理清楚4个目标
- 父类引用(“名”)
- 父类对象(“实”)
- 子类引用
- 子类对象
理清楚几个操作
// 父类
public class parent{}// 子类
public class sun{}
- 父类引用指向父类对象
parent p1 = new parent();
- 子类引用指向子类对象
son s1 = new son();
3. 父类引用指向子类对象
parent p2 = new son();
- 子类引用指向父类对象(错误!)
son s2 = new parent();
5. 将第3点强制转换为由子类引用指向该子类对象
son s3 = (son)p2;
6. 对于强制类型转换,转换结果不能是【子类引用指向父类】,这显然是错误的,java会进行强制类型转换检查。例如
parent p4 = new parent();
son s4 = (son)p4; // 错误!
弄明白几个操作
对于父类引用指向子类对象的情况,此时,父类引用只能操作父类的部分。
也就是说
能操作什么,取决于引用的类型,当然,与修饰限定符有关,只能操作public
和protected
修饰符的东西
这也可以印证,为什么子类引用不能指向父类对象,因为,父类对象没有子类的方法,而子类引用又可以操作子类方法,就会造成错误。
父类引用子类对象的时候,只能使用父类的共有或者保护方法
可以看到,强制转换之后,就相当于子类引用指向了子类对象,也就是正常的情况了。
错误的做法,子类引用指向父类对象
对于多次继承,同样遵循父类与子类的关系
可以单独把继承链中的某两个类抽出来,看作父类和子类,然后关系就和上面说的一样了。
小结
整体来说,就说了几件事情
左边指向右边,有4种情况,其中【子类引用指向父类对象】是不允许的
然后,对于【父类引用指向子类对象】,可以变换为【子类引用转换为父类对象】
还有一些访问权限的事情,与访问修饰符有关。