1. 程式人生 > >JavaSE實訓day03總結

JavaSE實訓day03總結

編譯 註意 過程 img new -1 blog 一個 mil

一、代碼

 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

反映到JavaJava VM Stack)的本地變量表,作為一個reference類型數據出現()

reference類型 引用類型,特殊類型,占4字節,具體表現為對象的名字(

Student

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總結