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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© zhangxinxin 黑马帝   /  2011-10-12 21:46  /  3762 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

父类为Person,子类为Man
Person p1=new Man();
这句代码可以在实际代码中应用,但这句代码在内存是怎么存储的,能否详细说一下。有点模糊。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

12 个回复

倒序浏览
我们这样理解一下吧,假设Person这个类占用1m的内存空间,man这个类占用2m的内存空间,因为子类跟父类的定义,JVM在调用子类的时候有一个默认的super(),会首先调用父类的构造方法,这样说你能理解么,?就是说子类在实例的时候会首先实例父类,你这样实例的意思我猜想是这样的,p1是指向子类的那个内存空间,但是这个2m的内存空间(上面解释过2M的空间是怎么来的了)里面有一个1m的空间这个空间是父类的实例,所以这个p1指向的是这个2m空间里面的1m空间,楼主您明白我的意思了么?这个逻辑我是手打的,完全是自己原来看到的一些东西和我的理解,所以您还需要进一步的考证,呵呵,望谅解,

评分

参与人数 1技术分 +1 黑马币 +1 收起 理由
admin + 1 + 1

查看全部评分

回复 使用道具 举报
子类构造过程必需调用父类的构造方法,如果不显示调用,则默认调用父类无参数的构造方法,new Man()其实就相当于在内存中new 了一个父类Person吧, ,我理解是这样的吧。

评分

参与人数 1技术分 +1 黑马币 +1 收起 理由
admin + 1 + 1

查看全部评分

回复 使用道具 举报
许冉 黑马帝 2011-10-12 22:59:36
板凳

new Man (); 在堆内存中创建一个Man类型的对象,称为实例,假设地址为 0x1122
Person p 在栈内存中创建一个Person类型的变量P,称为引用
然后把地址值0x1122 赋给了变量p

评分

参与人数 1技术分 +2 黑马币 +1 收起 理由
admin + 2 + 1

查看全部评分

回复 使用道具 举报

再问一句,产生的对象,可以说成是Man的对象,也可以说成是Person的对象,这句话,对吗
回复 使用道具 举报
朱华 黑马帝 2011-10-13 00:14:17
地板
zhangxinxin 发表于 2011-10-12 23:40
再问一句,产生的对象,可以说成是Man的对象,也可以说成是Person的对象,这句话,对吗 ...

嗯。。标题是一个问题,内容是另一个问题。
说白了,对象就是实例化后的类,一个类可以实例化很多很多的对象并操作属于他们自己的属性与方法。

见到NEW关键字,你就知道了,它是去堆中创建了一个MAN,而又把MAN的地址指向了他的父类p1,此时p1存在的位置应当是在栈中

这样的创建形式名为上转型,你创建了一个子类实例,却把它指向给了父类,如果非说产生的对象是谁的话,那该对象应该依旧是MAN,因为在堆中MAN对象可以调用自己的属性与方法,只不过你的引用是父类PERSON,导致了MAN对象缩水了,丧失了一些自己的方法,而只能转而调用父类的方法了。

评分

参与人数 1技术分 +2 收起 理由
admin + 2

查看全部评分

回复 使用道具 举报
庞金梁 黑马帝 2011-10-13 10:57:26
7#
是啊,我觉得楼主主要想问的是父类对象和子类对象转型的内存机理,曾经看到过这样一篇文章,好久了,也记不清具体的了,只是模模糊糊有一个概念,呵呵,
回复 使用道具 举报
chishibo 黑马帝 2011-10-13 11:33:09
8#
子类在父类中创建的1个对象,可以重写和调用父类中的方法
回复 使用道具 举报
黄锋 黑马帝 2011-10-14 08:51:08
9#
类是一个抽象的概念,对象则是类的具体实例,是真实的个体,比如人就是一个类,张三、李四等就是一个个真实的具体的个体对象,人有具备所有人类通用的特征,但不能确定是哪个人,张三、李四等有具体的特征,比如身高性别,即属性。类一种看不见摸不着的东西,对象是“有血有肉”的实物。现实生活中到处皆对象,比如一辆汽车,一栋房子,一台电脑,一只猫。面向对象具有封装、继承、多态三大特征。封装,即使属性用private修饰对外部不可见;继承,如人,有老人、小孩、男人、女人,他们都是人的子类。多态包括方法的重载和对象的多态性,方法的重载就是方法名相同,但参数和类型不
同的方法,多态,即人分为老人,小孩,男人,女人等。

评分

参与人数 1技术分 +2 黑马币 +1 收起 理由
admin + 2 + 1

查看全部评分

回复 使用道具 举报
刘浩 黑马帝 2011-10-14 11:03:25
10#

评分

参与人数 1技术分 +1 黑马币 +1 收起 理由
admin + 1 + 1

查看全部评分

回复 使用道具 举报
苏志伟 黑马帝 2011-10-14 13:13:45
11#

解析:
       在java中分了好多的内粗区域,而你问的这个问题奇偶设计到了两个内存区域!我们把这两区域叫做,堆内存,和栈内存。
        一般引用变量都会存储在栈内存中!什么是引用变量呢!比如说您题目中的p1就是个指向Person的的引用变量。
        那么new出来的这个类,就会存储在堆内存中!~存储的有这个类的各个属性...
       在拓展一下,还有什么常量池,方法区等等。。。java在内存中给分成了很多模块!
       在拓展一下,当没有引用变量指向堆内存中的某个对象得晚时候,那么这个对象就会变成垃圾了。。会等待垃圾回收器的回收。

评分

参与人数 1技术分 +2 收起 理由
admin + 2

查看全部评分

回复 使用道具 举报
本帖最后由 zhangxinxin 于 2011-10-15 13:17 编辑

可能我问的问题有点饶了,也可能某个问题点上我没想明白。我还想在这个问题基础上再问一个问题
我们在创建父类的引用变量p1后,在后面的使用中,我们可能会用p1引用到子类的对象实例中的属性了,方法等等。当然了,这些属性或者方法父类中也存在,子类中有的而父类中没有的属性或方法,p1也没法用。我的疑问出现在这里,p1怎么知道子类对象实例中的这个属性或方法在父类中没有?
通过后面学到的Class,我自己是这么理解的。p1中应该存放的是子类对象的地址,这个地址就是一个字节码,里面包含了父类Person和子类Man的信息,所以p1知道父类和子类是怎么样的构成,这样的理解,对吗?

评分

参与人数 1技术分 +2 黑马币 +1 收起 理由
admin + 2 + 1

查看全部评分

回复 使用道具 举报
孙运强 黑马帝 2011-10-15 13:55:57
13#
苏志伟 发表于 2011-10-14 13:13
解析:
       在java中分了好多的内粗区域,而你问的这个问题奇偶设计到了两个内存区域!我们把这两区域 ...

你好!能不能在详细说说什么是常量池和方法区
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马