对象多态性的使用,对象的向上与向下转型,instanceof关键字的主要作用
l 多态性
n 方法的多态性(同一个方法根据传入的参数不同 完成的功能也不同)
n 对象的多态性 (子类对象与父类对象之间的相互转换)
·子类对象向父类对象转换(由大到小) ---> 向上转型 自动转型(父类对象 = 子类对象)
·父类对象向子类对象转换(由小到大)----> 向下转型 强制转型(子类对象 = (子类)父类对象)
对象多态性是在继承应用上的一种扩展 因此程序要现有继承才能有多态
class A2 { public void fun1() { System.out.println("A2-->fun1"); } public void fun2() { this.fun1(); } } class B2 extends A2 { public void fun1() { System.out.println("B2-->fun1"); } public void fun3() { System.out.println("B2-->fun3"); } } public class Demo02_ { public static void main(String[] args) { //子类对象为父类实例化,此时a2 指向的是 堆内存中的子类开辟那部分空间 A2 a2 = new B2(); //fun1被子类覆写了 a2.fun2(); B2 b2 = (B2)a2; b2.fun2(); } } //如果一个方法被子类覆写了 则子类和父类发生转换时 自动调用已经被覆写过的方法 |
1.
b2 |
堆内存 |
栈内存 |
A2 a2 = new B2(); 如箭头所示 父类引用指向子类对象 但是a2只能看到 new A2()中的内容 看不到 B2中
newA2() |
new B2() |
的内容 虚线为 a2实际看到的内容
a2 |
2. B2 b2 = (B2)a2 将父类对象强制转换为子类对象
此时 a2可以看到整个 B2的内容了
★★如果一个方法被子类覆写了 当子类和父类之间转型时 自动去调用已经覆写过的方法(子类的方法)★★
l Instanceof 关键字
Instanceof的使用
· 对象 instanceof 类
· a instanceof B (如果对象 a 是类B的一个实例则返回 true 否则返回 false)
class A5 {} class B5 extends A5 {} public class Demo05_ { public static void main(String[] args) { //A5 a5 = new A5(); A5 a5 = new B5(); System.out.println(a5 instanceof A5);//true System.out.println(a5 instanceof B5);//true } } |
l 常见的两个异常 ClassCastException(两个对象之间没有任何关系而进行转换) NullPointerException 空指向异常
//从类A3的声明来看 根本看不出子类B3的存在 class A3 { public void fun1() { System.out.println("A3-->fun1"); } public void fun2() { this.fun1(); } } //从B3的声明来看 可以看出父类A3的存在 class B3 extends A3 { public void fun1() { System.out.println("B3-->fun1"); } public void fun3() { System.out.println("B3-->fun3"); } } public class< |