目录
先看下 == 的用法
可以看到abc和bObj指向的都是a,因此==能判断指向的终点
package com.humouren.object_;
public class Equlas1 {
public static void main(String[] args) {
A a = new A();
A b = a;
A c = a;
System.out.println(a == c);//ture
B bObj = a;
System.out.println(bObj == c);//ture
}
}
class B{ }
class A extends B{}
查看JDK源码
到了这个学习阶段,如果想要获得更多的提升就要去看看JDK的源码,JDK的源码在IDE里面配置好就能看到
方法
可以用everything搜索这个
然后打开相应的目录
这两个压缩文件就是jdk的源码了
查看代码中的函数的源码
方法
右键菜单
想要查看某个方法的源码,可以光标指向这个地方,然后按下Ctrl+B即可,也可以右键,找到声明或用例
快捷键传送
比如我对着这样一个代码的equals按下了Ctrl+B
"hello".equals("abc");
效果
可以看到,这里就是这个方法的具体实现细节,上面的意思是判断接收到了两个比较对象是不是一个内存地址,如果是就返回ture,如果不是就进一步比较里面的内容,可见equals不同与==之间的区别是不仅判断了两者是否为一个对象(比较的是对象的内存地址),还判断了两者的内容是不是一样的,通过下面的代码可以看出
package com.humouren.object_;
public class Equlas2 {
public static void main(String[] args) {
String a = "666";
String b = "666";
System.out.println(a == b);
System.out.println(a.equals(b));
C c = new C(12345);
D d = new D(12345);
//报错System.out.println(c == d);
System.out.println(c.equals(d));
}
}
class C{
int Cnumber;
public C(int cnumber) {
Cnumber = cnumber;
}
}
class D{
int Dnumber;
public D(int dnumber) {
Dnumber = dnumber;
}
}
false
true
true
然后你可以看到如果只是Object里面的equlas是只去判断两者的内存地址是否一样, 不同的类里面这个方法的判断方式还是有一点差别的
不同类的重写
比如这个是Object里面的
public boolean equals(Object obj) {
return (this == obj);
}
这个是String里面的
这里面把方法重写了,变成了判断值是否相等
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
return (anObject instanceof String aString)
&& (!COMPACT_STRINGS || this.coder == aString.coder)
&& StringLatin1.equals(value, aString.value);
}
同样的Integer里面
也重写了这个方法
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
那如何快速看到那些方法重写了
可以点击Object里equlas左边的小盘子
就可以看到了
如何重写equlas呢
应用实例
判断两个Person对象的内容是否相等,如果两个Person对象的各个属性值都一样,则返回true,反之false
框架
先写一下如果不重写方法的框架,很明显输出结果是false,因为这里的equlas调用的是Object里面的,功能只有判断内存地址是否相同,肯定不相同
package com.humouren.object_;
public class Equlas3 {
public static void main(String[] args) {
Person xiaoming = new Person("xiaoming", 12, 78.9);
Person xiaohong = new Person("xiaohong",18,99.7);
System.out.println(xiaohong.equals(xiaoming));
}
}
class Person{
String name;
int age;
double weight;
public Person(String name, int age, double weight) {
this.name = name;
this.age = age;
this.weight = weight;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public double getWeight() {
return weight;
}
public void setWeight(double weight) {
this.weight = weight;
}
}
开始重写
现在我在Person里面把来自Object的equlas拿过来重写一番
public boolean equals(Object obj) {
if (this == obj){
return true;
}
if(obj instanceof Person){
Person p = (Person) obj;
//向下转型一下,因为需要来自obj的各个属性
return this.name.equals(p.name) && this.age == p.age && this.weight == p.weight;
}
return false;
}
结果
现在上面的输出结果就是true了