Java面向对象-多态性
面向对象特征之三:多态性
*
* 1.理解多态性:可以理解为一个事物的多种形态。
* 2.何为多态性:父类的引用指向子类的对象
* 3.多态的使用,虚方法调用
* 有了对象的多态性以后,我们在编程期,只能调用父类中声明的方法,但在运行期,我们实际执行的是子类重写父类的方法。
*
* 总结:编译看左边,运行看右边
*
* 4.多态性使用的前提:
* ①继承关系
* ②方法的重写
*
*
* 5.为什么要有多态性?
*
* 6.多态性不用于属性(属性:编译运行都看左边)
*
*
* 向上转型(多态)
*
*
*
*
* 向下转型(使用)
*
*有了对象的多态性以后,内存中实际上是加载了子类特有的属性和方法,但是由于变量声明为父类类型,导致
*编译时,只能调用父类中声明的属性和方法。子类特有的属性和方法不能调用。
*
*如何才能调用子类特有的属性和方法?
*向下转型,使用强制类型转换
*
*使用强转型时,可能出现异常
*
*instanceof关键字使用
* a instanceof A :判断对象a是否是类A的实例,如果是,返回true;如果不是返回false
* 使用情景:为了避免向下转型时出现异常,我们在向下转型之前,先进行instanceof的判断,一旦
* 返回true,就进行向下转型。如果返回false,不进行向下转型。
public class PersonTest { public static void main(String[] args) { // // Person p1=new Man(); // p1.eat(); // p1.earnMoney(); //有了对象的多态性以后,内存中实际上是加载了子类特有的属性和方法,但是由于变量声明为父类类型,导致 //编译时,只能调用父类中声明的属性和方法。子类特有的属性和方法不能调用。 //如何才能调用子类特有的属性和方法? //向下转型,使用强制类型转换 //使用强转型时,可能出现异常 // // instanceof关键字使用 // a instanceof A :判断对象a是否是类A的实例,如果是,返回true;如果不是返回false //下转型对象 Person p2=new Man(); // Man man=(Man)p2; // man.earnMoney(); // Women women=(Women)p2; if(p2 instanceof Women) { Women women=(Women)p2; women.sleep(); } } } class Person { int age; String name; public void eat() { System.out.println("吃饭"); } public void walk() { System.out.println("走路"); } } class Man extends Person{ boolean fat; @Override public void eat() { System.out.println("男人吃饭"); } @Override public void walk() { System.out.println("男人走路"); } public void earnMoney() { System.out.println("赚钱"); } } class Women extends Person{ boolean height; @Override public void eat() { System.out.println("女人吃饭"); } @Override public void walk() { System.out.println("女人走路"); } public void sleep() { System.out.println("睡觉"); } }