Java的面向对象
13-Object类及其toString()/equals()方法
2021-07-06 409 0
简介 Object类是Java中所有类的父类,其中有比较常用的方法,例如toString()和equals()方法等...
1. Object类的使用
Object类属于java.lang包下
1.Object类是所有Java类的根父类
2.如果在类的声明中未使用extends关键字指明其父类,则默认父类为java.lang.Object类,也就是Object类是所有类的直接父类或间接父类。
3.Object类中的功能(属性、方法)具有通用性。
属性:无
方法:equals() / toString() / getClass() /hashCode() / clone() / finalize()
wait() 、 notify()、notifyAll()
4. Object类只声明了一个空参的构造器
2. equals方法
在面试中,经常问到 == 和 equals的区别
一、==
== :运算符
1. 可以使用在基本数据类型变量和引用数据类型变量中
2. 如果比较的是基本数据类型变量:比较两个变量保存的数据是否相等。(不一定类型要相同)
如果比较的是引用数据类型变量:比较两个对象的地址值是否相同.即两个引用是否指向同一个对象实体
补充: == 运算符使用时,必须保证符号左右两边的变量类型一致(或者能进行自动类型提升)。
二、equals()
1. 是一个方法,而非运算符
2. 只能适用于引用数据类型
3. Object类中equals()的定义:也就是如果没有重写 equals,那么会调用 Object 类中的改方法,实际上就是使用了 == 运算符
public boolean equals(Object obj) {
return (this == obj);
}
说明:Object类中定义的 equals() 和 == 的作用是相同的:比较两个对象的地址值是否相同.即两个引用是否指向同一个对象实体
4. 像 "String、Date、File、包装类" 等都重写了Object类中的equals()方法。重写以后,比较的不是两个引用的地址是否相同,而是比较两个对象的"实体内容"是否相同。
以下是JDK8中String类的equals方法的具体实现:
public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String)anObject; 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; }
equals() 和 == 的使用举例:
package com.ylaihui.oop8; import java.util.Date; public class EqualsTest { public static void main(String[] args) { //基本数据类型 int i = 10; int j = 10; double d = 10.0; System.out.println(i == j);//true System.out.println(i == d);//true boolean b = true; // System.out.println(i == b); char c = 10; System.out.println(i == c);//true char c1 = 'A'; char c2 = 65; System.out.println(c1 == c2);//true //引用类型: String str1 = new String("ylaihui"); String str2 = new String("ylaihui"); System.out.println(str1 == str2);//false System.out.println(str1.equals(str2));//true Date date1 = new Date(32432525324L); Date date2 = new Date(32432525324L); System.out.println(date1.equals(date2));//true } }
3. 自定义类重写equals
通常情况下,我们自定义的类如果使用equals()的话,也通常是比较两个对象的"实体内容"是否相同。那么,我们就需要对Object类中的equals()进行重写.
重写的原则:比较两个对象的实体内容是否相同.
自定义类,开发中一般使用开发工具自动生成(当然也可以自己写),重写equals方法后, 比较两个自定义类的对象的时候,是比较的内容,如果没有重写,那么调用的是 ==。
Eclipse 中 alt+shift+s, 生成hashCode 和 equals方法
4. toString方法的使用
Object类中toString()的使用:
1. 当我们输出一个对象的引用时,实际上就是调用当前对象的toString()
2. Object类中toString()的定义:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
3. 像String、Date、File、包装类等都重写了Object类中的toString()方法。使得在调用对象的toString()时,返回"实体内容"信息
4. 自定义类也可以重写toString()方法,当调用此方法时,返回对象的"实体内容"
//ToStringTest.java package com.ylaihui.oop8; class Cup{ String name; // alt + shift + s @Override public String toString() { return "Cup [name=" + name + "]"; } } public class ToStringTest { public static void main(String[] args) { Cup cup = new Cup(); // 输出一个对象的引用时,实际上就是调用当前对象的toString() System.out.println(cup); System.out.println(cup.toString()); String s = new String("ylaihui"); System.out.println(s); } }