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 个回复

倒序浏览
加油!
回复 使用道具 举报
对于此贴,我必须发张水贴来点个赞,我现在就在基础班,大家一起加油!
回复 使用道具 举报
自学之路坎坷而艰辛 加油!
回复 使用道具 举报
楼主在上基础班?
回复 使用道具 举报
多谢分享!再仔细看看
回复 使用道具 举报
lz在细节上理解的还不是很到位,以至于不知道默认初始化啥时候进行的。
静态的就先不说了,从lz第3步说起:

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

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



回复 使用道具 举报
围观了一下,同样没基础
回复 使用道具 举报
Piaoyu 中级黑马 2015-1-12 09:07:04
9#
总结的不错啊
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马