Object 类的使用
类 java.lang.Object
是类层次结构的根类,即所有其它类的父类。每个类都使用 Object
作为超类。
Object类型的变量与除Object以外的任意引用数据类型的对象都存在多态引用
method(Object obj){…} //可以接收任何类作为其参数
Person o = new Person();
method(o);
-
所有对象(包括数组)都实现这个类的方法。
-
如果一个类没有特别指定父类,那么默认则继承自Object类。例如:
public class Person {
...
}
//等价于:
public class Person extends Object {
...
}
Object类的方法
1、(重点)equals()
= = :基本类型比较值:只要两个变量的值相等,即为true。
int a=5;
if(a==6){…}
引用类型比较引用(是否指向同一个对象):只有指向同一个对象时,==才返回true。
Person p1=new Person();
Person p2=new Person();
if (p1==p2){…}
用“==”进行比较时,符号两边的数据类型必须兼容
(可自动转换的基本数据类型除外),否则编译出错
equals():所有类都继承了Object,也就获得了equals()方法。还可以重写。
只能比较引用类型,Object类源码中equals()的作用与“==”相同:比较是否指向同一个对象。
-
格式:obj1.equals(obj2)
-
特例:当用equals()方法进行比较时,对类File、String、Date及包装类(Wrapper Class)来说,是比较类型及内容而不考虑引用的是否是同一个对象;
-
原因:在这些类中重写了Object类的equals()方法。
-
-
当自定义使用equals()时,可以重写。用于比较两个对象的“内容”是否都相等
-
重写equals()方法的原则
-
对称性
:如果x.equals(y)返回是“true”,那么y.equals(x)也应该返回是“true”。 -
自反性
:x.equals(x)必须返回是“true”。 -
传递性
:如果x.equals(y)返回是“true”,而且y.equals(z)返回是“true”,那么z.equals(x)也应该返回是“true”。 -
一致性
:如果x.equals(y)返回是“true”,只要x和y内容一直不变,不管你重复x.equals(y)多少次,返回都是“true”。 -
任何情况下,x.equals(null),永远返回是“false”;
x.equals(和x不同类型的对象)永远返回是“false”。
-
package equals;
/**
* ClassName: User
* Package: equals
* Description:
*
* @Author 吴伟贤
* @Create 2024/3/18 21:16
* @Version 1.0
*/
public class User {
private String name;
private int age;
public User() {
}
public User(String name, int age) {
this.name = name;
this.age = age;
}
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;
}
@Override//为什么equals(Object obj)参数为Object类型,因为Object是所以类的父类。
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj instanceof User) {//使用instanceof确保传进来的对象是User类
User user = (User) obj;//多态,强转 转为user对象,对象.调用成员属性
return this.age == user.age && this.name.equals(user.name);
}
return false;
}
public static void main(String[] args) {
User user1 = new User("wwx", 22);
User user2 = new User("wwx", 22);
System.out.println(user1 == user2);
System.out.println(user1.equals(user2));//重写equals方法后 false->true 重写的意义为了判断两对象属性是否相等
// String s = new String("hello");
// String s1 = new String("hello");
//
// System.out.println(s == s1);
// System.out.println(s.equals(s1));
String s = "AAA";//字符常量池中只会有一个AAA. s,s1都指向这一个
String s1 = "AAA";
System.out.println(s==s1);//true
}
}
面试题:==和equals的区别
-
== 既可以比较基本类型也可以比较引用类型。对于基本类型就是比较值,对于引用类型就是比较内存地址
-
equals的话,它是属于java.lang.Object类里面的方法,如果该方法没有被重写过默认也是==;我们可以看到String等类的equals方法是被重写过的,而且String类在日常开发中用的比较多,久而久之,形成了equals是比较值的错误观点。
-
具体要看自定义类里有没有重写Object的equals方法来判断。
-
通常情况下,重写equals方法,会比较类中的相应属性是否都相等。