1 Object 类
类 java.lang.Object 是类层次结构的根类,即所有其它类的类,每个类都使用 Object 类作为超类;

- Object 类型的变量与除 Object 以外的任意引用数据类型的对象都存在多态引用;、
- 所有对象(包括数组)都实现这个类的方法;
- 如果一个类没有特别指定父类,那么默认则继承自 Object 类。例如:
public class Test {
}
// 等价于:
public class Test extends Object{
}
// 上面Test类和下面Test继承Object的类是一样的
2 Object 类的方法
2.1 equals() 重点
用 " == " 判断时:
- 基本数据类型 比较的是值:只要两个变量的值相等,即为 true ;
public class Test {
public static void main(String[] args) {
int a = 10;
int b = 10;
if (a == b) {
System.out.println("a == b");
}else {
System.out.println("a != b");
}
// 输出:a == b
}
}
- 引用类型比较,引用(是否指向同一个对象):只有指向同一个对象时, == 才返回 true ;
// p1 和 p2 的地址值不同,所以在用 " == " 判断 p1 和 p2 是否相等时,p1 和 p2 时不相等的;
Person p1 = new Person();
Person p2 = new Person();
System.out.println(p1); // Object.Test_01.Person@3b07d329
System.out.println(p2); // Object.Test_01.Person@41629346
if (p1 == p1){
System.out.println("p1 == p1");
}else {
System.out.println("p1 != p1");
}
// 输出 : p1 == p1
// p1 和 p2 的地址值不同,所以在用 " == " 判断 p1 和 p2 是否相等时,p1 和 p2 时不相等的;
if (p1 == p2){
System.out.println("p1 == p2");
}else {
System.out.println("p1 != p2");
}
// 输出 : p1 != p2
注意:用 “ == ” 进行比较时,符号两边的数据类型必须兼容(可以自动转换的基本数据类型除外),否则编译出错;
用 equals() 判断时:
equals() 是 Object 类中的一个方法,只能比较引用类型;
Object 类中 equals() 方法,默认和 “ == ” 相同,比较的都是对象地址值是否相同;
public boolean equals(Object obj) {
if (this == obj)
}
equals() 调用格式:A.equals(B) // 解释:这里是A调用 equals 方法,判断 A 和 B 是否相等;
注意:(特例)
当用 equals() 方法进行比较时,对于 File、String、Date 及包装类(Wrapper Class)来说,是比较类型及内容而不考虑引用的是否是同一个对象;
原因:在这些类当中,重写了 Object 类的 equals() 方法;
equals() 的重写
重写的原则:
- 对称性:如果 A.equals(B) 返回的是 " true " ,那么 B.equals(A) 返回的也是 " true " ;
- 自反性:A.equals(A) 返回的必须是 " true " ;
- 传递性:如果 A.equals(B) 返回的是 " true " ,B.equals(C) 返回的也是 " true " , 那么 C.equals(A) 返回的也是 " true " ;
- 一致性:如果 A.equals(B) 返回的是 " true " ,只要 A 和 B 的内容一直不变,不管重复多少次 A.equals(B) ,返回的都是 " true " ;
- 任何情况下:
- A.equals(null) ,返回的永远是 " false " ;
- A.equals(和A不同类型的对象) ,返回的永远是 " false " ;
重写举例:
public class Test_01 {
public static void main(String[] args) {
Person p1 = new Person("张三",20);
Person p2 = new Person("张三",20);
System.out.println(p1.equals(p2)); // true
Person p3 = new Person("李四",20);
Person p4 = new Person("张三",20);
System.out.println(p3.equals(p4)); // false
}
}
----------------------------------------
public class Person {
private String name;
private int age;
// equals() 方法重写
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj instanceof Person) {
Person person = (Person) obj;
return this.name == person.name && this.age == person.age;
}
return false;
}
public Person() {
}
public Person(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;
}
}
2.2 toString() 重点
- 默认情况下,toString() 返回的是 ” 对象的运行时类型 @ 对象的 hashCode 值的十六进制形式 " ;
- 在进行 String 与其他类型数据的连接操作时,自动调用 toString() 方法;
Date date = new Date();
System.out.println("date = " + date); // date = Tue Jul 23 09:17:24 CST 2024
System.out.println("date = " + date.toString()); // date = Tue Jul 23 09:17:24 CST 2024
// 上面两个输出结果相同
- 当我们直接 System.out.println(对象); ,默认调用的时这个对象的 toString() ;
- 重写 toString() :可以根据需要在用户自定义中重写 toString() 方法,例如:String 类重写 toString() 方法,返回字符串的值;
子类使用 toString() 方法:
自定义,在没有重写 Object 类的 toString() 情况下,默认返回的是当前对象的地址值;
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
-------------------------------------
public class Test_toString {
public static void main(String[] args) {
Person p1 = new Person("张三",22);
// 自定义,在没有重写 Object 类的 toString() 情况下,默认返回的是当前对象的地址值;
System.out.println(p1.toString()); // Object.Test_02.Person@3b07d329
}
}
对于 File、String、Date 及包装类等 Object 的子类来说,它们都重写了 Object 类的 toString() ,在调用 toString() 时,返回当前对象的实体内容;
public class Test_toString {
public static void main(String[] args) {
Date date = new Date();
System.out.println("date = " + date); // date = Tue Jul 23 09:17:24 CST 2024
System.out.println("date = " + date.toString()); // date = Tue Jul 23 09:17:24 CST 2024
// 上面两个输出结果相同
}
}
在开发中使用:
习惯上,开发中对于自定义的类在调用 toString() 时,也希望显示其对象的实体内容,这个时候就要重写 Object 类中的 toString() 方法;
举例:
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// 重写 toString() 方法
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
---------------------------------------
public class Test_toString {
public static void main(String[] args) {
Person p1 = new Person("张三",22);
// 自定义,在没有重写 Object 类的 toString() 情况下,默认返回的是当前对象的地址值;
System.out.println(p1.toString()); // Object.Test_02.Person@3b07d329
// 重写 toString() 后输出结果为 : Person{name='张三', age=22}
System.out.println(p1.toString()); // Person{name='张三', age=22}
}
}
4154

被折叠的 条评论
为什么被折叠?



