让我们先了解指针,jvm的操作
在计算机科学中,指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向(points to)存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“指针”。意思是通过它能找到以它为地址的内存单元。
java的指针
我在学习go语言看到对指针与对象应用从go语言介绍的一本书,看到对面向对象的解释,c++语言是在c的基础上添加语法糖,而java和c#都是遵循着c++语言惯例而设计的他们的成员方法中都带有一个隐藏的this指针,pyhton方法中会有一个self参数和this指针的作用是完全一样的。
官方文档的解释在Oracle的一些Java虚拟机实现中,对类实例的引用是指向句柄的指针,该句柄本身是一对指针:一个指向包含对象方法的表和指向Class表示对象的对象的指针。 对象的类型,另一个是从堆中为对象数据分配的内存。引-java-doc-2.7
JVM的栈和堆
栈每个Java虚拟机线程都有一个私有Java虚拟机栈,与线程同时创建。引-java-doc-2.5.2
堆的解释Java虚拟机具有在所有Java虚拟机线程之间共享的堆。堆是运行时数据区,从中分配所有类实例和数组的内存。引-java-doc-2.5.3
栈上的操作(既一个方法的操作)当创建包含它的帧时,操作数堆栈为空。Java虚拟机提供指令以将局部变量或字段中的常量或值加载到操作数堆栈上。其他Java虚拟机指令从操作数堆栈中获取操作数,对它们进行操作,并将结果推回操作数堆栈。操作数堆栈还用于准备要传递给方法和接收方法结果的参数。引-java-doc-2.6.2
通过栈上的操作,可以知道栈上操作的是具体的值或者从对象指针从堆内存中获取的值。
要操作对象内的值,需要通过指针从堆内存中取出来放到栈里。下面是一个栈的操作过程
这样的栈操作会引起一些问题,
比如传递性问题public static void main(String[] args) {
Role role = new Role();
role.setRoleName("管理");
System.out.println("role :" +role.getRoleName());
change(role);
System.out.println("change role :" +role.getRoleName());
}
private static void change(Role role) {
role.setRoleName("小组");
}
结果role :管理
change role :小组
可以发现role这个对象的roleName改变了,在开发过程中我们的对象可能要转递好几个方法,如果我们不注意指针的传递,可能会导致我们错误的把对象的值修改了。
还有交换问题。
指针引发的问题值传递和引用传递
浅拷贝和深拷贝
参考
«https://segmentfault.com/a/1190000016960388?utm_source=tag-newest»
«https://docs.oracle.com/en/java/javase/index.html»