zoukankan      html  css  js  c++  java
  • 静态多态与动态多态

     面向对象编程的多态从绑定时间来看,可以分成静态多态和动态多态,也称为编译期多态和运行期多态。

    java中overload是静态多态,即根据参数列表进行最佳匹配,在编译阶段决定要具体执行哪个方法。而与之相反,overriden methods则是在run-time进行动态检查。

    举例说明:

    public class UseAnimals {
    	public void doStuff(Animal a) {
    		System.out.println("Animal");
    	}
    	public void doStuff(Horse a) {
    		System.out.println("Horse");
    	}
    	
    
    }
    class Animal{
    	public void eat()
    	{
    	}
    }
    class Horse extends Animal{
    	public void eat(String food) {}
    }
    public class TestUseAnimals {
    	public static void main(String[] args) {
    		UseAnimals ua = new UseAnimals();
    		
    		Animal animalobj = new Animal();
    		Horse horseobj = new Horse();
    		Animal animalRefToHorse = new Horse();
    		
    		ua.doStuff(animalobj);//Animal
    		ua.doStuff(horseobj);//Horse
    		ua.doStuff(animalRefToHorse);//Animal
    		
    	}
    
    }
    

      可以看见UseAnimals里面有两个 doStuff方法,但参数列表不同,属于overload,在编译阶段决定执行哪个方法,毕竟参数是Animal类型还是Horse类型,这些是编译阶段就可以判断的。但引用类型具体执行哪个方法是根据静态编译阶段来决定的。比如ua.doStuff(animalRefToHorse)  ,animalRefToHorse在编译阶段是判断Animal类型,所以执行doStuff(Animal a)的方法。

    public class UseAnimals {
    	public static void main(String[] args) {
    		Animal a =new Animal();
    		a.eat();
    		
    		Horse h = new Horse();
    		h.eat();
    		
    		Horse ah = new Horse();
    		ah.eat();
    		
    		Horse he =new Horse();
    		he.eat("Apples");
    		
    	//	Animal ah2=new Animal();
    	//	ah2.eat("Carrots");  编译不能通过
    		
    	//	Animal ah2=new Horse();
    	//	ah2.eat("Carrots");  编译不能通过
    		
    		
    	}
    	
    
    }
    class Animal{
    	public void eat()
    	{
    		System.out.println("eat");
    	}
    }
    class Horse extends Animal{
    	public void eat(String food) 
    	{
    		System.out.println("eat"+food);
    	}
    }
    

      而override则是动态多态,执行方法是在run-time决定

    public class UseAnimals {
    	public static void main(String[] args) {
    	//	Animal a=new Animal();编译不能通过
    		Animal a=new Dog();
    		Animal b =new Cow();
    		a.vocalize();//Woof!
    		b.vocalize();//Moo!
    		
    	}
    	
    
    }
    interface Animal{
    	void vocalize();
    }
    class Dog implements Animal{
    	@Override
    	public void vocalize() {
    		System.out.println("Woof!");
    	}
    }
    class Cow implements Animal{
    	@Override
    	public void vocalize() {
    		System.out.println("Moo!");
    	}
    }
    

      

  • 相关阅读:
    Oracle:SQL语句--对表的操作——删除表
    Oracle:SQL语句--对表的操作——修改表名
    Oracle:SQL语句--对表的操作——修改表名
    Oracle:SQL语句--对表的操作—— 删除字段(即删除列)
    网络配置4:vlan间通信配置
    网络配置3:动态路由配置
    网络配置2:静态路由配置
    网络配置0:网络设备基础知识
    网络配置1:VLAN配置
    T-SQL之数据操作(一):增删改
  • 原文地址:https://www.cnblogs.com/blairwaldorf/p/9194588.html
Copyright © 2011-2022 走看看