A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 一生一世 中级黑马   /  2012-4-25 21:22  /  1738 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

大家好,我是一个菜鸟,最近学习java的时候遇到了一个问题,希望大家能够帮帮我:
就是多态也(即动态绑定或池绑定)在内存中是怎么样运行的,在内存分配的四块空间中(stack,heap,date segment和code segment)怎么样存储,怎么样运行?谢谢

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1 加油,亲

查看全部评分

3 个回复

正序浏览
class Anmail{
               public String name;
         Anmail(){
          show();
}
}
class Dog extends Anmail{
             pubic int age=9;
Dog(){
        super()//默认调用父类的无参构造函数
     this.age=age;
}
       public void show(){
                   System.out.println(num);
     }
public static void main(String[] args){
           Fu fu=new Zi();
           fu.show();
  }
}
在对父子类进行编译的时候,会被编译成class文件,当虚拟机把主函数加载到内存中的时候,即main被加载到栈中,当运行到Fu fu=new Zi();的时候,会把父类与子类的class文件加载到内存中
这时虚拟机走到new Zi()的时候,会对其成员变量在堆中进行默认初始化,会调用子的构造函数对其初始化,但是子类的构造函数的第一条语句是super即父类的无参构造函数。这个时候,调用父类的无参构造函数,但是这时候父类会持有
子类的一个引用即this,当进入到父类的构造函数中是,调用到show方法,这个方法不是父类的,而是this引用对象的那个,所以会调用子类的方法。到此,第一句话结束,运行到fu.show()的时候,
由于要看实际运行的是那个类,所以调用的还是子类的方法。
回复 使用道具 举报
class Anmail{
               public String name;
}
class Dog extends Anmail{
             pubic int age;
Dog(){


}
回复 使用道具 举报
我也来说说。。。。
  1. class Fu
  2. {
  3.         public void show(){
  4.            System.out.println("show fu");
  5.   }
  6. }
  7. class Zi extends Fu
  8. {
  9.         public void show()
  10.         {
  11.                 System.out.println("show zi");
  12.         }
  13.         public static void main(String[] args)
  14.         {
  15.                 Fu f = new Zi();
  16.                 f.show();
  17.         }
  18. }
复制代码
看上面这个小代码和图片:
在main方法中,我创建了一个Fu类的引用f,这个f存放在,栈内存中的main方法片区里面
当new Zi();一执行,就会在堆内存中创建一个Zi类对象。f这个引用就会指向堆内存中新new出来的那个对象(也就是说那个对象在堆内存中的地址会存放在f中)。
等我们调用f的时候,其实这个f指向的是堆内存中存在的Zi类对象,因此调用的方法也是Zi类对象里面的show方法。如果我在Zi类方法中再定义一个父类没有的方法,那么f这个引用就不能调用那个方法了。

战队.jpg (518.96 KB, 下载次数: 24)

战队.jpg

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马