JavaSE实训day03总结
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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字节,具体表现为对象的名字(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总结的主要内容,如果未能解决你的问题,请参考以下文章