本人是一只JAVA新手小菜鸟,今天学习了下JAVA的多态,把学习到的东西记录到这里,希望对跟我一样刚开始学习JAVA的新手有所帮助,有写的不对的地方,大家轻喷~多斧正~
一、多态存在的必要条件
1、要有继承;
2、要有重写;
3、要有父类引用指向子类对象;
~~~~~~~~~~~~~~~~~~~~~~~~~~
一旦同时满足这三个条件,当调用父类被重写的方法的时候,你new的是哪个对象,调用的就是哪个对象的重写方法。
二、代码示例
public class DynamicBinding {
public static void main(String[] args) {
Cat c = new Cat("c","blue");
Lady l1 = new Lady("l1",c);//这里调用Lady的构造方法,将Cat对象的一个引用c传给了Lady构造方法中的Animal对象的一个引用,在内存中就发生了Animal的引用指向了一个子类Cat的对象
l1.myPetEnjoy();//该方法中有调用父类的被重写方法
}
class Animal{
public String name;
Animal(String name){
this.name = name;
}
public void enjoy(){
System.out.println("叫声。。。。。。");
}
}
class Cat extends Animal{//这里有继承
public String eyesColor;
Cat(String n,String c){
super(n);
eyesColor = c;
}
public void enjoy(){//这里有重写
System.out.println("猫叫声。。。。。。");
}
}
class Lady{
public String name;
public Animal pet;
Lady(String name,Animal pet){
this.name = name;
this.pet = pet;
}
public void myPetEnjoy(){
pet.enjoy();//调用父类的被重写方法
}
}
最后输出结果:“猫叫声。。。。。。”
三、内存解析
示例代码中,main方法里,l1.myPetEnjoy()其实按照引用应该调用的是Animal.enjoy,但由于多态机制的存在,实际调用的是Cat.enjoy
即动态的去找该调用哪个方法,new的是哪个对象就调用哪个对象的方法,示例中new的是
Cat c = new Cat("c","blue");
然后,Lady中传入的就是这个new出来的“c”
Lady l1 = new Lady("l1",c)
所以最后调用的其实是Cat.enjoy
内存解析如下:
Cat c = new Cat("c","blue");
Lady l1 = new Lady("l1",c);
l1.myPetEnjoy();