`

多态,动态绑定

阅读更多
调用方法时,只要方法重写了,实际当中调哪个,要看实际中new哪个对象。

好处:可扩展性达到最好。当增加东西时,不需要改原来的结构,直接加上就可以了。

多态的存在必要条件:1:要有继承,2:要有重写,3:父类引用指向子类对象。

package test;

class Animal{
	private String name;
	Animal(String name){this.name = name;}
	public void enjoy(){
		System.out.println("叫声");
	}
}

class Cat extends Animal{
	private String eyesColor;                       //自己的成员变量
	Cat (String n,String c){super(n);eyesColor = c;}//构造方法
	public void enjoy(){                            
        //与父类不同,有自己独特方法,所以需要重写enjoy方法
		System.out.println("猫叫声");
	}  
}

class Dog extends Animal{
	private String furColor;
	Dog (String n,String c){super(n);furColor = c;}
	public void enjoy(){
		System.out.println("狗叫声");
	}  
}

class Lady{
	private String name;
	//定义Animal类型,可以给程序带来最大的灵活性,(定义成父类的引用)
        private Animal pet;
	Lady(String name,Animal pet){//构造方法
		this.name = name;
		this.pet = pet;
	}
	public void myPetEnjoy(){
		pet.enjoy();
	}
}

public class Test {
	public static void main(String args[]){
		Cat c = new Cat("catname","blue");
		Dog d = new Dog("dogname","black");
		Lady l1 = new Lady("l1",c);
		Lady l2 = new Lady("l2",d);
		l1.myPetEnjoy();
		l2.myPetEnjoy();
	}
}




输出结果:
猫叫声
狗叫声

Why?
动态绑定是指“在执行期间(而非编译期)判断所引用对象的实际类型,根据其实际的类型调用其相应的方法“

上面例子中,根据Lady对象的成员变量pet所引用的不同的实际类型而调用相应的enjoy方法。
  • 大小: 59.5 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics