1、理解多态性*:可以理解为一个事物的多种形态
2、何为多态性:可以称为对象的多态性,即父类引用指向子类对象或子类对象赋给父类的引用
3、多态性的使用(虚拟方法调用)
有了对象的多态以后,我们在编译期,只能调用父类中声明的方法,但在运行期,我们实际执行的是子类重写父类的方法。
总结:编译看左边,运行看右边
4、多态的使用前提;①类的继承关系②方法的重写
5、对象的多态性:只适用于方法,不适用于属性
public class PersonTest {
public static void main(String[] args) {
//对象的多态性:父类引用指向子类对象
Person p1 = new Man();
//多态的使用:当调用子父类同名同参数的方法时,实际执行的是子类重写父类的方法---虚拟方法调用
p1.eat();//执行的是子类重写的eat()方法
p1.walk();
System.out.println("*************************************");
}
特别说明:有了对象的多态性以后,内存中实际上是加载了子类特意又的属性和方法的,但是由于便是声明为Person类型的,编译时,只能调用父类中声明的属性和方法,子类中特有的属性和方法不能调用。
问题引入:如何才能调用子类特有的属性和方法呢?
答:使用强制类型转换(向下转型)。
但是使用强转,可能出现ClassCastException的异常。因此我们必须使用instancof关键字来避免出现异常
instanceof关键字的使用
a instanceof A;判断对象a是否是类 A的实例,如果是返回true,否则返回false。
使用情境:为了避免在向下转型时出现ClassCastException的异常 我们在向下转型之前,先进行instanceof的判断。一旦是返回true就进行向下转型,如果返回false就不进行向下转型
补充:如果a instanceof A返回true;那么a instanceof B也返回true。其中类B是类A的父类。
整个测试代码入下
package com.atguigu.java2;
/*
* 面向对象的特征之三:多态性
*
* 1、理解多态性:可以理解为一个事物的多种形态
* 2、何为多态性:
* 对象的多态性:父类引用指向子类对象
* 3、多态的使用,虚拟方法调用
* 有了对象的多态以后,我们在编译期,只能调用父类中声明的
* 方法,但在运行期,我们实际执行的是子类重写父类的方法
* 总结:编译看左边,运行看右边
* 4、多态的使用前提;①类的继承关系②方法的重写
* 5、对象的多态性:只适用于方法,不适用于属性
*
*
*/
public class PersonTest {
public static void main(String[] args) {
//对象的多态性:父类引用指向子类对象
Person p1 = new Man();
//多态的使用:当调用子父类同名同参数的方法时,实际执行的是子类重写父类的方法---虚拟方法调用
p1.eat();//执行的是子类重写的eat()方法
p1.walk();
System.out.println("*************************************");
//不能调用子类所特有的方法,编译时,p2是Person类型
/*
* 有了对象的多态性以后,内存中实际上是加载了子类特意又的属性和方法的
* 但是由于便是声明为Person类型的,编译时,只能调用父类中声明的属性和
* 方法,子类中特有的属性和方法不能调用
* */
//如何才能调用子类特有的属性和方法?
//使用强制类型转换(向下转型)
Man m1 = (Man)p1;
m1.earnMoney();
//使用强转时,可能出现ClassCastException的异常
// Woman w1 = (Woman)p1;
// w1.goShopping();
/*
* instanceof关键字的使用
*
* a instanceof A;判断对象a是否是类 A的实例,如果是返回true,否则返回false
*
* 使用情境:为了避免在向下转型时出现ClassCastException的异常
* 我们在向下转型之前,先进行instanceof的判断。
* 一旦是返回true就进行向下转型,如果返回false就不进行向下转型
*
*
* 如果a instanceof A返回true;那么a instanceof B也返回true
* 其中类B是类A的父类
*/
if(p1 instanceof Woman) {
Woman w1 = (Woman)p1;
w1.goShopping();
System.out.println("************woman***************");
}
if(p1 instanceof Man) {
Man w1 = (Man)p1;
w1.earnMoney();
System.out.println("************man***************");
}
if(p1 instanceof Person) {
System.out.println("************Person***************");
}
if(p1 instanceof Object) {
System.out.println("************Object***************");
}
//练习:
//问题一:编译时通过,运行时不通过
// Person p3 = new Man();
// Woman w2 = (Woman)p3;
//问题二、编译时通过,运行时也通过,变向的多态
Object obj = new Man();
Person p4 = (Person)obj;
p4.eat();
//问题三、编译不通过
// Man man = new Woman();
}
}