这是今天学习到的一个子类继承父类内存图,感觉很晕乎,自己总结了一下。: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:~~
|