zoukankan      html  css  js  c++  java
  • 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()+"陆军打炮");
        }
    }
    

      

  • 相关阅读:
    OI数学知识清单
    线段树入门教程
    扩展欧几里得定理基础讲解 代码及证明
    名字竞技场 V3.0
    可持久化线段树(主席树)新手向教程
    矩阵乘法浅析
    [Luogu] P1233 木棍加工
    高斯消元 模板
    位运算技巧
    [ZJOJ] 5794 2018.08.10【2018提高组】模拟A组&省选 旅行
  • 原文地址:https://www.cnblogs.com/tanlei-sxs/p/9943121.html
Copyright © 2011-2022 走看看