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()+"陆军打炮");
    }
}

  

 

posted @ 2018-11-11 19:33  言西早石头侠  阅读(393)  评论(0编辑  收藏  举报