java中的多态及其内存分析

多态(polymorphism):在执行期间(而非编译器)判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。由于是在运行期的动态实现,直到new出对象才能确定具体调用的哪个方法,因此多态又叫动态绑定,也叫迟绑定。

 

   实现条件

                1.类之间继承或者实现接口;

            2.方法重写;

            3.父类引用指向子类对象。

 

   练习

                   猫、狗类实现抽象类动物的enjoy()方法,main方法中实现enjoy()方法的动态调用。

 

            代码实现:

 

[java] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. abstract class Animal {  
  2.     private String name;  
  3.     Animal(String name) {  
  4.         this.name = name;  
  5.     }  
  6.     public abstract void enjoy();  
  7. }  
  8.   
  9. class Cat extends Animal {  
  10.     private String eyescolor;  
  11.     Cat(String name,String eyescolor) {  
  12.         super(name);  
  13.         this.eyescolor = eyescolor;  
  14.     }  
  15.       
  16.     public void enjoy() {  
  17.         System.out.println("猫叫声。。。");  
  18.     }  
  19. }  
  20.   
  21. class Dog extends Animal {  
  22.     private String furcolor;  
  23.     Dog(String name,String furcolor) {  
  24.         super(name);  
  25.         this.furcolor = furcolor;  
  26.     }  
  27.       
  28.     public void enjoy() {  
  29.         System.out.println("狗叫声。。。");  
  30.     }  
  31. }  
  32. /* 
  33. class Bird extends Animal { 
  34.     Bird() { 
  35.         super("bird"); 
  36.     } 
  37.     public void enjoy() { 
  38.         System.out.println("鸟叫声。。。"); 
  39.     } 
  40. */  
  41.   
  42. class Lady {  
  43.     private String name;  
  44.     private Animal pet;  
  45.     Lady(String name, Animal pet) {  
  46.         this.name = name;  
  47.         this.pet = pet;  
  48.     }  
  49.     public void myPetEnjoy() {pet.enjoy();}  
  50. }  
  51.   
  52. public class Test {  
  53.     public static void main(String[] args) {  
  54.         Dog g = new Dog("mydog","black");  
  55.         Cat c = new Cat("mycat","blue");  
  56.         Bird b = new Bird();  
  57.         Lady l1 = new Lady("l1",g);  
  58.         Lady l2 = new Lady("l2",c);  
  59.         //Lady l3 = new Lady("l3",b);  
  60.         l1.myPetEnjoy();  
  61.         l2.myPetEnjoy();  
  62.         //l3.myPetEnjoy();  
  63.     }  
  64. }  

 

               运行结果:

               内存分析:

                 

             stack中存放临时变量,heap中存放new出的实例对象,为简单起见,图中略去了代码中Dog类对象以及相应的l1对象。

        多态的实现是通过调用方法为运行时动态生成的Cat对象指向的Cat:enjoy()方法实现。

特性:

        多态的存在能够更好的让我们去实现代码的可扩展性(具体练习中可将Bird类、main方法的注释去掉,则会在无需修改其他类的情况下实现鸟叫声的扩展),大大提高了我们程序的灵活性。

总结:

        多态在之前已有过学习,但理解并不是深入,通过这次学习的相应内存分析,还是深刻了很多,对内存也有过一些了解,但之前并没有将这两方面的学习联系起来,分析内存对程序的运行过程有了进一步的了解。

posted @ 2016-12-17 11:26  天涯海角路  阅读(437)  评论(0)    收藏  举报