欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Notes on Thinking in Java

程序员文章站 2022-03-11 18:41:53
...

第一章 对象导论
第二章 一切都是对象
前两章是从宏观来介绍面向对象编程相关的内容,挺有意思,可多看几遍。
笔记从第三章开始:

第三章 操作符

别名现象

[ 赋值对象引用会发生什么](https://blog.csdn.net/zane06/article/details/79705768) 将一个对象赋值给另一个对象,实际上是将引用从一个地方复制到另一个地方。

若想保持两个对象彼此独立,不建议直接操作对象内的域。容易导致混乱,且违背了面向对象程序设计的原则。
解决方案:深克隆
https://blog.csdn.net/DeMonliuhui/article/details/54572908
https://blog.csdn.net/nishuishenhan/article/details/4693710
https://blog.csdn.net/qq_28081081/article/details/80455150

==和equals

1)对于==比较的是值是否相等

如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等;
如果作用于引用类型的变量,则比较的是所指向的对象的地址

2)对于equals方法,注意:equals方法不能作用于基本数据类型的变量,equals继承Object类,比较的是是否是同一个对象

如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;
诸如String、Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容。

int x = 10;
int y = 10;
String str1 = new String("abc");
String str2 = new String("abc");
System.out.println(x == y); // 输出true
System.out.println(str1 == str2); // 输出false

String str1 = new String("abc");
String str2 = new String("abc");
System.out.println(str1.equals(str2));//输出true
System.out.println(str1 == str2);//输出false

上述str1和str2都是在堆内存中创建了对象!new了

String s1 = "abc";
String s2 = "abc";
System.out.println(s1.equals(s2));//输出true
System.out.println(s1 == s2);//输出true

为什么第二个会是true呢?
涉及到了内存中的常量池,常量池属于方法区的一部分,当运行到s1创建对象时,如果常量池中没有,就在常量池中创建一个对象"abc",第二次创建的时候,就直接使用,所以两次创建的对象其实是同一个对象,它们的地址值相等。

相关标签: 读书笔记