概念:同一操作作用于某一类对象,可以有不同的解释,产生不同的执行结果
多态存在的三个必要条件
- 需要存在继承和实现关系
- 同样的 方法调用而执行不同操作,运行不同的代码(重写操作)
- 在运行时父类或者接口的引用变量可以引用其子类的 对象
package com.tanlei.newer; public class AnimalDemo { public static void main(String[] args) { Animal animal=new Dogg("哈哈"); Animal animal2=new Cat("花花"); animal.eat(); animal2.eat(); } } class Animal { private String name; public Animal(String name) { this.name = name; } // 这是一个通用方法 // 只是告诉其子类去实现它 public void eat() { } } class Dogg extends Animal { public Dogg(String name){ super(name); } public void eat() { System.out.println("狗啃骨头"); } } class Cat extends Animal { public Cat(String name){ super(name); } public void eat() { System.out.println("猫吃鱼"); } }
对象上下转型
向上转型 子类 --->父类
Animal animal=new Dogg("哈哈");//向上转型 //向上转型 安全 但可能会导致子类的方法丢失
//父类的引用变量只能调用父类中有的方法或者子类重写的方法
向下转型 父类--->子类
//向下转型 不安全 if(animal2 instanceof Cat) { Cat cat=(Cat)animal2; cat.sleep(); }
instanceof
用法:
object instanceof class / /object是class或其子类的一个实例
动态绑定
编译前绑定 (静态绑定)
Person.sayHi();
运行时,根据变量实际引用的对象类型决定调用哪个方法(动态绑定)
Person p =new Teacher(); o.sayHi();