首页 > 代码库 > JavaSE实训day03总结

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   

 

反映到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总结