Java面向对象----多态概念,对象上下转型
概念:同一操作作用于某一类对象,可以有不同的解释,产生不同的执行结果
多态存在的三个必要条件
- 需要存在继承和实现关系
- 同样的 方法调用而执行不同操作,运行不同的代码(重写操作)
- 在运行时父类或者接口的引用变量可以引用其子类的 对象
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()+"陆军打炮"); } }