我没有“对象”

类与对象

三大特征

面向对象四大特征: 封装、继承、多态.

Object类和包装类

equals
1
2
3
4
5
6
7
 Student st1 = new Student("小明",12);
Student st2 = new Student("小明",12);
System.out.println(st1.equals(st2)); //false
--------------------------------------
String s1 = new String("哈啊哈哈");
String s1 = new String("哈啊哈哈");
System.out.println(s1.equals(s2)); //true

大家都知道引用数据类型变量保存的是地址值,equals()方法比较是对象的内容,上述两组代码比较的内容一样,为啥结果却不一样,不要着急,我们首先看看Object类中的equals方法的源码

1
2
3
public boolean equals(Object obj) {
return (this == obj);
}

观看源码才发现,Object类中的equals方法实际上比较的是地址值,Object类是根父类,而Student类并没有重写equals方法.所以st1 不等于st2.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    public boolean equals(Object anObject) {
if (this == anObject) { //上来就比较俩变量的地址值是否相等
return true;
}
if (anObject instanceof String) {//判断anObject是否属于String类型
String anotherString = (String)anObject;//强转anObject类型为String
int n = value.length; //字符数组的长度,也就是字符串的长度
if (n == anotherString.value.length) {//比较两字符串的长度是否相等
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;//不是String类型,就直接返回false
}
//比较每一个字符是否相等

由于String类对Object类的equals方法进行重写,确立比较每一个字符相等.所以s1 == s2.

自定义类重写equals方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public boolean equals(Object obj){
if(this == obj){
return true;
}
if(obj instanceof Student){
Student cust = (Student) obj;
//比较两个对象的每个属性是否都相同
if(this.age == cust.age && this.name.equals(cust.name)){
return true;
}else{
return false;
}
}
return false;
}

接口与抽象

坚持原创技术分享,您的支持将鼓励我继续创作!
-------------本文结束感谢您的阅读-------------
(>看完记得五星好评哦亲<)
0%