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方法,会比较类中的相应属性是否都相等。