多态性:
多态性是指允许不同子类型的对象对同一消息作出不同的响应。简单的说就是用同样 的对象引用调用同样的方法但是做了不同的事情。
1.理解多态性:可以理解为一个事物的多种形态。
2.何为多态性:
对象的多态性:父类的引用指向子类的对象(或子类的对象赋给父类的引用)
3. 多态的使用:虚拟方法调用
有了对象的多态性以后,我们在编译期,只能调用父类中声明的方法,但在运行期,我们实际执行的是子类重写父类的方法。
总结:编译,看左边;运行,看右边。
4.多态性的使用前提: 1、 类的继承关系 2、 方法的重写
5.对象的多态性,只适用于方法,不适用于属性(编译和运行都看左边):
若子类重写了父类方法,就意味着子类里定义的方法彻底覆盖了父类里的同名方法,系统将不可能把父类里的方法转移到子类 中。(编译看左边,运行看右边)。
对于实例变量则不存在这样的现象,即使子类里定义了与父类完全相同的实例变量,这个实例变量依然不可能覆盖父类中定义的 实例变量(编译运行都看左边)。
例如:
package com.hao.zhi.lv.extendTest3;
public class Person {
String name;
int age;
public Person(){
}
public void eat(){
System.out.println("人要吃饭");
}
public void show(){
System.out.println("人要表现自己");
}
}
package com.hao.zhi.lv.extendTest3;
public class Student extends Person {
private int age=16;
public void eat(){
System.out.println("学生要吃好吃的");
}
public void study(){
System.out.println("学生要多学习");
}
}
package com.hao.zhi.lv.extendTest3;
public class PersonTest {
public static void main(String args[]) {
//对象的多态性:父类的引用指向子类的对象
Person p1 = new Student();
//多态的使用:当调用子父类同名同参数的方法时,实际执行的是子类重写父类的方法 ---虚拟方法调用
p1.eat();
//对象有的多态性后,在编译期,只能调用父类中声明的方法,否则编译会出错
// p1.study();
}
}
对象类型转换和instanceof 操作符:
对Java对象的强制类型转换称为造型。
1、从子类到父类的类型转换可以自动进行。
2、从父类到子类的类型转换必须通过造型(强制类型转换)实现。
3、无继承关系的引用类型间的转换是非法的。
4、在造型前可以使用instanceof操作符测试一个对象的类型。
例如:
//为了能调用子类特有的属性和方法 ,得进行类型转换
//向下转型:使用强制类型转换符。
Animal a1=new Cat();
Cat c1=(Cat) a1;
c1.call();
使用强转时,可能出现ClassCastException的异常,这是由于转换之间的类无继承关系:
Dog d1=(Dog) a1;
输出:
所以我们得提前判断转换的类之间是否有继承类型,这时就需要instanceof 操作符
x instanceof A:检验x是否为类A的对象,返回值为boolean型。
1、 要求x所属的类与类A必须是子类和父类的关系,否则编译错误。
2、 如果x属于类A的子类B,x instanceof A值也为true。
例如:
/**
* 使用情境:为了避免在向下转型时出现ClassCastException的异常,我们在向下转型之前,先
* 进行instanceof的判断,一旦返回true,就进行向下转型。如果返回false,不进行向下转型。
*/
if (a1 instanceof Animal) {
Cat c1 = (Cat) a1;
c1.call();
} else {
System.out.println("a1所属的类跟Animal无继承关系");
}
/**
* 如果 a instanceof A返回true,则 a instanceof B也返回true.
* 其中,类B是类A的父类。
*
*/
if (a1 instanceof Object) {
System.out.println("a1所属的类跟Object类有间接继承关系");
}
参考来自尚硅谷