Java中并没有显示的使用指针,而且也不允许编程的过程中使用指针,但实际上,一个对象的访问就是通过指针来实现的,一个对象会从实际的存储空间的某个位置开始占据一定的存储体。该对象的指针就是一个保存了对象的存储地址的变量,并且这个存储地址就是对象在存储空间中的起始地址。在许多高级语言中指针是一种数据类型,在Java中是使用对象的引用来替代的。
创建一个People类,有name(String),id(String)两种属性;
People p = null;
People q = new People("Jack","0004");
这里创建了两个对于对象引用的变量p和q。变量p初始化为null
,null
是一个空指针,它不指向任何地方,也就是说它不指向任何类的对象,因此null
可以复制给任何类的对象的引用。变量q是一个对于People类的实例引用,操作符new
的作用实际上是为对象开辟足够的内存空间,而引用p是指向这一内存空间地址的指针。
继续编写:
People p1 = new People("David","0001");
People p2 = p1;
p2.setName("Denny");
System.out.println(p1.getName());
运行结果为:
Denny
这段代码中对People类的对象p2的name成员变量进行了设置,值为Denny。但是这时就会发现,p1的成员变量name的值也变成了Denny。
原因就是p1和p2都是对对象的引用,在完成赋值语句People p2 = p1;
后,p2和p1指向通一个存储空间,所以对于p2的修改也影响到了p1,如图所示:
继续编写:
People p1 = new People("David","0002");
People p2 = new People("David","0002");
System.out.println(p1 == p2);
在这里虽然p1与p2的所有成员变量的内容均相同,但是由于它们指向不同的存储空间,所以,输出语句输出结果为false。p1与p2的指向不同打的存储空间,如图所示:
由此可见,如果我们希望完成对象的拷贝,使用一个简单的赋值语句是无法完成的。要达到这一目的可以通过实现Cloneable接口并重写clone方法来完成。如果我们希望判断两个对象引用是否一致是可以覆盖继承自Object类的equals方法来实现。
2018年11月06日,将本文标签更改为转载,原意本文为记录用,但今天无意间发现这篇文章的阅读量和其他文章相差甚远,特在此改正。