对象的多态性只适用于方法,不适用于属性(编译运行都看左边).
3.多态的使用称为虚拟方法调用
子类方法重写的时候,父类称为虚拟方法,编译调用虚拟方法。
方法可以重写,属性不重写。如果父类和子类拥有同名属性,则调用改子类的时候实际有两个同名变量,可以通过this和super来区别。
1.什么是多态性
2.什么是虚拟方法调用
3.一个类可以有几个父类,一个父类可以有多少个子类,
子类能获取直接父类的父类中的结构吗,子类能否获取父类中private权限的属性或方法
(可以,写get,set方法)
重写
方法名形参列表一样,子类权限必须比父类大,父类是private子类不能继承,void void ,
父类是引用数据类 子类必须是继承类的引用数据类,父类是基本数据类,子类也是一样的基本数据类。
super
调用属性方法构造器
super调用构造器
this形参列表调用本类重载的构造器,
super形参列表调用父类重载的构造器。
instanceof
有了对象的多态性以后,内存中实际上是加载了子类特有的属性和方法,但由于变量声明为父类类型,
导致编译时,只能调用父类中声明的属性和方法。子类特有的属性和方法不能调用。
如何调用子类特有的属性和方法?
强制类型转换
Man子 m1=(Man)P2父;向下转型
强转有风险。使用强转时可能出现ClassCastException 异常
所以引入一个关键字instanceof;
问题:我强转之后还能使用父类的特有的方法吗。
可以
格式
if(A instanceof a){
子类 B = 子类 A
}
如过上面能通过那么
if(A instanceof a的父类){
sout"这也能通过"
}
强转一般用于不满足于父类仅有的多态性,想要使用子类特有的方法时。