概念:同一操作作用于某一类对象,可以有不同的解释,产生不同的执行结果
多态存在的三个必要条件
- 需要存在继承和实现关系
- 同样的 方法调用而执行不同操作,运行不同的代码(重写操作)
- 在运行时父类或者接口的引用变量可以引用其子类的 对象
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();
p.sayHi();
多态案例---使用多态实现士兵作战下程序
package com.tanlei.newer;
public class SoldierDemo {
public static void main(String[] args) {
Soldier soldier=new KJSolider("TANL", 22);
soldier.attack();
Soldier soldier1=new KJSolider("aa", 22);
soldier1.attack();
Soldier soldier2=new KJSolider("ccc", 22);
soldier2.attack();
}
}
abstract class Soldier{
private String name;
private int age;
public Soldier(String name, int age) {
this.name = name;
this.age = age;
};
public String getName() {
return name;
}
//所有部队行动
public void gongji() {
start();
attack();
end();
}
public void start() {
System.out.println("准备攻击");
}
public void end() {
System.out.println("攻击完成");
}
public abstract void attack();
}
//海军
class HJSolider extends Soldier{
public HJSolider(String name, int age) {
super(name, age);
}
public void attack() {
System.out.println(getName()+"海军打海炮");
}
}
//空军
class KJSolider extends Soldier{
public KJSolider(String name, int age) {
super(name, age);
}
public void attack() {
System.out.println(getName()+"空军发炮");
}
}
//陆军
class LJSolider extends Soldier{
public LJSolider(String name, int age) {
super(name, age);
}
public void attack() {
System.out.println(getName()+"陆军打炮");
}
}