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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始



    这是今天学习到的一个子类继承父类内存图,感觉很晕乎,自己总结了一下。:lol:lol
1.JVM读取指定目录下的class文件,主函数进到静态方法区,被调用后在栈内存中开辟了空间。
2.class加载的同时父类与子类的静态方法会先到静态的方法区。(先是父类然后是子类)
3.new子类对象,这时候给子类对象进行初始化,先访问到子类的构造方法,因为子类构造方法中隐式的super()语句,就会先到父类构造方法初始化。
父类的构造方法加载到方法区。(这里有个问题就是new zi的时候应该是先就到堆内存中开辟了空间了吧?:o)
4.因为父类没有创建对象,所以父类会在堆内存中(子类对象的内存)有一片区域标记为super(所以super关键字准确的说是父类内存空间的表示,只是可以认为是父类对象引用)。这篇区域会指向一片临时的可以理解为给父类对象初始化的地址。
5.父类初始化完毕,这时候对子类成员变量进行显式初始化值,int num =20,在new zi的同时会有一个this对象(这里不太理解)和 z是同一个地址值。
6.继续初始化子类的普通方法,子类方法区跟堆内存中的子类对象有关联。
7.在内存中初始化完毕了,因为是空构造所以什么都没有做,这时候所做的事情就是new好了一个子类对象。
8.子类中的show方法访问的是子类对象中的num既是20.如果想访问父类中num加上super就可以了。

总感觉自己这样总结很渣,欢迎大神指正批评。有一点一直没明白就是默认初始化是在什么时候开始的?

根据这个正好也总结了对象初始化的顺序:对象的初始化先执行静态代码块,然后执行构造代码块,接着就是执行父类构造方法和非静态代码块,然后才执行子类构造方法和非静态代码块。
(注意静态代码块只会执行一次)
-----------------------------------------------------------------------------------------------------------------------------
     说个题外话,我也是个真正的零基础,完全是凭着自己的兴趣还有就是那些比我更努力的人的催动。我们宿舍4个人,一回来在房子里除了激烈的讨论,几乎没有什么交流,只有电脑的风扇声,还有啪啪啪的敲代码!声,有时候你能完全沉浸在思想的激烈碰撞中,学习真的很美好,很幸福!
    我12点半睡的也不过是最早睡的。为什么能这样拼?我一直也在想,如果谈梦想我感觉真的不适合,我们只不过是凭着年轻的一腔热血,凭着手中唯一的热爱,去努力的拼一把,因为不管别人怎么想,至少我知道我是真的喜欢这个感觉。
   看到过很多次有人说零基础能不能学好java,我就告诉你一句话,不怕的人前方才有路!
   即使java虐我千百遍,我待java如初恋,还在努力学基础的同志们加油吧:victory:~~

评分

参与人数 2技术分 +4 收起 理由
lwj123 + 2 写的很好啊
杨佳名 + 2 加油!

查看全部评分

8 个回复

正序浏览
Piaoyu 中级黑马 2015-1-12 09:07:04
9#
总结的不错啊
回复 使用道具 举报
围观了一下,同样没基础
回复 使用道具 举报
lz在细节上理解的还不是很到位,以至于不知道默认初始化啥时候进行的。
静态的就先不说了,从lz第3步说起:

3.分配空间。在分配空间时,会把子类、父类的两个对象的空间一次性都分配完毕,然后将这两个对象的属性都设置为默认值,也就是 sum 这个属性都被设置为0
4. 递归构造父类对象  {这里也就是 sum赋值10,然后调用构造方法Fu()}
5.显示初始化子类对象的属性,也就是 sum 赋值 20
6.调用子类的构造方法 Zi()

其中5、6步就是构造子类对象的过程



回复 使用道具 举报
多谢分享!再仔细看看
回复 使用道具 举报
楼主在上基础班?
回复 使用道具 举报
自学之路坎坷而艰辛 加油!
回复 使用道具 举报
对于此贴,我必须发张水贴来点个赞,我现在就在基础班,大家一起加油!
回复 使用道具 举报
加油!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马