尽管java中没有显示的使用指针并且也不允许程序员使用指针,而实际上对象的访问就是指针的实现。一个对象会从实际的存储空间的某个位置开始占据一定数量的存储体。该对象的指针就是保存了该对象的存储地址的变量,并且这个存储地址就是对象在改空间开始的位置。在需要编程语言中指针是一种数据类型 在java中指针实际上就是对象的引用。
我们来举个例子说下吧:
People p=null;
People q=new People("name","age");
这里创建了2个对于对象的引用的变量p,q (他们被放置在栈内存之中)。变量p被初始化为null(初始化的数据是被放置在堆内存之中) 其实null就是一个空指针,每个对象的引用都可以初始化为null 他表示次对象不指向任何地方,也就是他不指向任何类的对象。
变量q是一个对于people类的实例的引用 操作符new的意思是 告诉计算机申请足够的内存的 ,而引用q就是这个内存地址的指针。
为此请读者考虑如下代码的运行结果:
People p1 = new People("钱志鹏","23");
People p2 = p1;
p2.setName("qzp");
System.out.println(p1.getName());
估计很多人跟我考虑的结果一样 p1.getName="钱志鹏" 但是结果并不是这样的 因为当你执行people p2=p1的时候 也就是说 原来p1跟p2都是对象的引用 当你执行完赋值之后
他们2个都指向了同一个内存地址 因此对于p2的修改 同样也会影响到p1的
请读者继续考虑以下代码的运行结果:
People p1 = new People("David","0004");
People p2 = new People("David","0004");
System.out.println(p1= = p2);
这虽然p1跟p2的值都相同 但是由于他们指向不同的存储空间 因此输出为false。
可见如果我们希望通过完成对象的拷贝 使用一个简单的赋值语句是无法完成的。要达到这个目的可以通过事项cloneable借口并重写clone方法来完成。如果我们希望判断两个对象的引用是否一致 可以通过equie方法来进行判断