一、引入
1.理解多态性:可以理解为一个事物的多种形态。
2.何为多态性:
对象的多态性:父类的引用指向子类的对象(或子类的对象赋给父类的引用)
3.多态的使用:虚拟方法调用
有了对象的多态性以后,我们在编译期,只能调用父类中声明的方法,
但在运行期,我们实际执行的是子类重写父类的方法
总结:编译,看左边;运行,看右边。
4.多态性的使用前提:
① 类的继承关系
② 方法的重写
5.对象的多态性只适用于方法不适用于属性(属性的编译和运行都看左边)
6.小习题:子类可以继承父类中private权限的属性或方法吗?
答:可以。
证明:只要有get、set方法依然可以调用,或者把private的属性或方法放在一个public的方法中,当调用方法时,private的方法也被调用了。这里要认清:封装性是处理能不能调用,而继承性是看能不能获取两者不矛盾
public class PersonTest {
public static void main(String[] args) {
// 对象的多态性:父类的引用指向子类的对象
Person p1 = new Man();
Person p2 = new Woman();
// 多态的使用:当调用子父类同名同参数的方法时,实际执行的是子类重写父类的方法----虚拟方法调用
p1.eat();
p2.sleep();
//p1.earn; 错误的
}
}
二、instanceof关键字的使用:
* a instanceof A : 判断对象a是否是类A的实例,如果是,返回true。如果不是,返回false。
*
* 使用情境:为了避免在向下转型时出现ClassCastException的异常,我们在向下转型之前,
* 先进行instanceof的判断,一旦返回true,就进行向下转型。如果返回flse,不进行向下转型
*
* 如果a instanceof A返回true,并且a instanceof B也返回true.
* 那么,类B是类A的父类。
public class PersonTest {
public static void main(String[] args) {
// 对象的多态性:父类的引用指向子类的对象
Person p1 = new Man();
Person p2 = new Woman();
// 多态的使用:当调用子父类同名同参数的方法时,实际执行的是子类重写父类的方法----虚拟方法调用
p1.eat();
p2.sleep();
// p1.earn; 错误的
// Man m = (Man)p2;
Woman w = (Woman) p2;
// m.earn();//错误:java.lang.ClassCastException
// if(m instanceof Man) {
// System.out.println("nb");
// }
if (w instanceof Woman) {
System.out.println("nr");
}
if (w instanceof Person) {
System.out.println("nr");
}
if (w instanceof Object) {
System.out.println("nr");
}
/*
* 练习: 问题一:编译时通过,运行时不通过 例一 Persh p3 = new woman( ); Man m3 =(Man)p3; 例二 Person p
* = new Person(); Man m = (Man)p; 问题二:编译通过,运行也通过 Object o = new Man(); Person p
* = (Person)o;
*/
}
}