1.多态性指的是什么?多态性可以理解为一个事物的多种表现形态。
1)方法的重载与重写
2)子类对象的多态性
2.子类对象的多态性使用的前提:①要有类的继承 ②要有子类对父类方法的重写。
3.程序运行分为编译状态和运行状态。
对于多态性来说,编译时,"看左边",将此引用变量理解为父类的类型。
运行时,"看右边",关注于真正对象的实体:子类的对象。那么执行的方法就是子类重写的。
4.子类对象的多态性,并不使用于属性。
范例:
//子类对象的多态性:父类的引用指向子类对象。
Person p1 = new Man(); //向上转型
//虚拟方法调用:通过父类的引用指向子类的对象实体,当调用方法时,实际执行的是子类重写父类的方法。
p1.eat(); //在子类中重写了此方法
一、案例:向上转型
1.Person.java(父类)
package me.gorden.java; public class Person { public void eat(){ System.out.println("Person类的eat()方法"); } public void walk(){ System.out.println("Person类的walk()方法"); } }
2.Man.java(子类)
package me.gorden.java; public class Man extends Person{ @Override public void eat() { System.out.println("Man类的eat()方法"); } @Override public void walk() { System.out.println("Man类的walk()方法"); } }
3.JavaTest.java测试类
package me.gorden.java; import org.junit.Test; public class JavaTest { @Test public void demo1(){ Person person = new Man(); person.eat(); } }
结果:调用了子类重写的方法
二、案例:向下转型
//子类对象的多态性:父类的引用指向子类对象。
Person p1 = new Man(); //向上转型
//虚拟方法调用:通过父类的引用指向子类的对象实体,当调用方法时,实际执行的是子类重写父类的方法。
p1.eat(); //在子类中重写了此方法
p1.walk(); //在子类中重写了此方法
//使用强转符:()
Man m = (Man)p1; //向下转型
其他类都和上面的一样,只有测试类不一样
1、JavaTest.java(测试类)
package me.gorden.java; import org.junit.Test; public class JavaTest { @Test public void demo1(){ Person person = new Man(); person.eat(); Man man = (Man) person; man.eat(); } }
结果: