File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change 4141 * [ Java程序员必读的书籍] (第2章 Java编程基础/Java程序员必读的书籍.md)
4242 * [ Google Java编程风格指南] ( https://alleniverson.gitbooks.io/java-basic-introduction/content/第2章%20Java编程基础/Google%20Java编程风格指南.html )
4343 * [ 详细介绍JAVA和C++区别] ( https://alleniverson.gitbooks.io/java-basic-introduction/content/第2章%20Java编程基础/详细介绍JAVA和C++区别.html )
44+ * [ Java与指针] (第2章 Java编程基础/Java与指针.md)
4445 * [ 引用、指针和句柄的区别] (第2章 Java编程基础/引用、指针和句柄的区别.md)
4546 * [ 什么是堆和栈,它们在哪儿?] (第2章 Java编程基础/什么是堆和栈,它们在哪儿?.md)
4647* [ 第3章 面向对象] ( https://alleniverson.gitbooks.io/java-basic-introduction/content/第3章%20面向对象/README.html )
Original file line number Diff line number Diff line change 1919 * [ Google Java编程风格指南] (第2章 Java编程基础/Google Java编程风格指南.md)
2020 * [ Java程序员必读的书籍] (第2章 Java编程基础/Java程序员必读的书籍.md)
2121 * [ 详细介绍JAVA和C++区别] (第2章 Java编程基础/详细介绍JAVA和C++区别.md)
22+ * [ Java与指针] (第2章 Java编程基础/Java与指针.md)
2223 * [ 引用、指针和句柄的区别] (第2章 Java编程基础/引用、指针和句柄的区别.md)
2324 * [ 什么是堆和栈,它们在哪儿?] (第2章 Java编程基础/什么是堆和栈,它们在哪儿?.md)
2425
Original file line number Diff line number Diff line change 55"author" : " AllenIverson" ,
66"gitbook" : " 3.2.2" ,
77"pdf" : {
8- "fontFamily" : " 等线 "
8+ "fontFamily" : " 微软雅黑 "
99 }
1010}
Original file line number Diff line number Diff line change 1+ ---
2+ typora-copy-images-to : images
3+ ---
4+
5+ 尽管在Java中没有显式的使用指针并且也不允许程序员使用指针,而实际上对象的访问就是使用指针来实现的。一个对象会从实际的存储空间的某个位置开始占据一定数量的存储体。该对象的指针就是一个保存了对象的存储地址的变量,并且这个存储地址就是对象在存储空间中的起始地址。在许多高级语言中指针是一种数据类型,而在Java中是使用对象的引用来替代的。
6+
7+ 考虑前面我们定义的People类,以及下列语句:
8+
9+ ``` java
10+ People p = null ; q = new People (" Jack" ," 0001" );
11+ ```
12+
13+ 这里创建了两个对于对象引用的变量p和q。变量p初始化为null,null是一个空指针,它不指向任何地方,也就是它不指向任何类的对象,因此null可以赋值给任何类的对象的引用。变量q是一个对于People类的实例的引用,操作符new的作用实际上是为对象开辟足够的内存空间,而引用p是指向这一内存空间地址的指针。
14+
15+ 为此请读者考虑如下代码的运行结果:
16+
17+ ``` java
18+ People p1 = new People (" David" ," 0004" );
19+ People p2 = p1;
20+ p2. setName(" Denny" );
21+ System . out. println(p1. getName());
22+ ```
23+
24+ 这段代码中对People类的对象引用p2的name成员变量进行了设置,使其值为字符串"Denny"。但是我们会发现在输出p1的成员变量name时并不是输出"David",而是"Denny"。原因是p1与p2均是对对象的引用,在完成赋值语句" People p2 = p1; "后,p2与p1指向同一存储空间,因此对于p2的修改自然会影响到s1。通过图1-4可以清楚说明这段代码运行的情况。
25+
26+ ![ 1502019084540] ( images/1502019084540.png )
27+
28+ 请读者继续考虑以下代码的运行结果:
29+
30+ ``` java
31+ People p1 = new People (" David" ," 0004" );
32+ People p2 = new People (" David" ," 0004" );
33+ System . out. println(p1= = p2);
34+ ```
35+
36+ 在这里虽然p1与p2的所有成员变量的内容均相同,但是由于它们指向不同的存储空间,因此,输出语句输出的结果为false。图1-5说明了p1与p2的指向。
37+
38+ ![ 1502019174168] ( images/1502019174168.png )
39+
40+ 可见如果我们希望完成对象的拷贝,使用一个简单的赋值语句是无法完成的。要达到这一目的可以通过实现Cloneable接口并重写clone方法来完成。如果我们希望判断两个对象引用是否一致时可以覆盖继承自Object类的equals方法来实现。
You can’t perform that action at this time.
0 commit comments