Java与指针

来源:互联网 发布:网络推广具体做什么 编辑:程序博客网 时间:2024/05/08 02:06

  Java中并没有显示的使用指针,而且也不允许编程的过程中使用指针,但实际上,一个对象的访问就是通过指针来实现的,一个对象会从实际的存储空间的某个位置开始占据一定的存储体。该对象的指针就是一个保存了对象的存储地址的变量,并且这个存储地址就是对象在存储空间中的起始地址。在许多高级语言中指针是一种数据类型,在Java中是使用对象的引用来替代的。
  创建一个People类,有name(String),id(String)两种属性;

People p = null;People q = new People("Jack","0004");

  这里创建了两个对于对象引用的变量p和q。变量p初始化为nullnull是一个空指针,它不指向任何地方,也就是说它不指向任何类的对象,因此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方法来实现。