JavaSE實訓day03總結
一、代碼
1 package mypack; 2 import mypack.A; 3 4 class A 5 { 6 public void m1(){ 7 System.out.println("hi"); 8 } 9 } 10 11 public class Test 12 { 13 public static void main(String[] args){ 14 A hello = new A(); 15 hello.m1(); 16 } 17 }
public class Student { private String s; public String getS() { return s; } public void setS(String s) { this.s = s; } public String toString() { return "Student [s=" + s + "]"; } } Student stu = new Student(); stu.setS(s); System.out.println(stu);
二、解析
代碼1.
CMD命令下:
javac -d . Test.java
java mypack.Test
結果:
-d 按指定文件目錄級編譯
mypack.Test 全限定名 包名.類名 mypack.Test.class
代碼2.
Student stu = new Student();
解析:
01 Student stu
反映到Java棧(Java VM Stack)的本地變量表,作為一個reference類型數據出現()。
reference類型 引用類型,特殊類型,占4字節,具體表現為對象的名字(
02 new Student();
反映到Java堆中,形成了一塊存儲了Student類型的具有實例數據值的結構化內存。根據具體對象類型以及虛擬機實現對象內存局部表的不同,這塊內存的長度是不固定的。同時Java堆中還包含查找此對象信息的地址信息。
即:堆裏面開辟存儲了,
1.Student對象
2.對象具有初始化的值,String對應 空串
3.地址信息
對象訪問具體方式過程
通過reference類型如何訪問Java堆中的對象?主流的訪問方式有兩種:
1.使用句柄訪問方式
Java堆中會劃分出一塊內存來作為句柄池,reference中存儲的就是對象的句柄地址,而句柄地址中包含了對象實例數據和類型數據各自的具體地址。
註意:
1.堆裏面有2塊東西,第一句柄池,第二實例池
2.句柄池存了2個東西,
第一,指向實例數據的指針(具體指針),指的是具體數據
第二,指向類型數據的指針(模具指針),指的是方法區數據類型
2.使用直接指針訪問方式
Java堆對象的布局中就必須考慮如何放置訪問類型數據的相關信息,reference中直接存儲的就是對象堆地址。
優勢對比:
句柄訪問方式:最大的好處就是:reference中存儲的是穩定的句柄地址,在對象被移動(垃圾回收時移動對象是非常普遍的行為)時只要修改句柄中的實例數據指針,而reference本身不需要被修改。
因為多用了內存存類型數據的指針,2個指針,2次定位
直接指針訪問方式:最大好處就是速度快,它節省了一次指針定位的時間開銷。
只有一個指針,存具體數據的指針
JavaSE實訓day03總結