文章目录
- 1.Object 类
- 2.Object 类常用方法
- 2.1.equals方法
- 3.== 和 equals 的区别
- 3.1.==
- 3.2.equals() 方法的使用
- 4.toString方法
- 5.hashCode()方法
1.Object 类
在JDK中提供一个Object类,它是类层次结构的根类,每个类都直接或间接基础自该类,所有对象(包括数组)都实现了这个类的方法 。
如果在类的声明中未使用extends关键字指明基类,则默认基类为Object类
public class Person {
}
等价于
public class Person extends Object {
}
2.Object 类常用方法
2.1.equals方法
1、equals
方法,用于比较两个对象是否相同,它其实就是使用两个对象的内存地址在比较。Object
类中的equals方法内部使用的就是==
比较运算符。
public class Animal extends Object {
private String name;
public Animal(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
class TestAnimal{
public static void main(String[] args) {
Animal a=new Animal("小白");
Animal b=new Animal("小白");
boolean flag = a.equals(b);//false
}
}
2、试试创建两个String对象,调用equals方法比较一下,你看看会有什么结论?为什么?因为String类重写了equals方法,改成比较内容了
String s1=new String("1");
String s2=new String("1");
boolean flag1 = s1.equals(s2);//true
JavaSDK提供的一些类,如String,Date等,重写了Object类的equals方法,调用这些类的equals方法,x.equals(y),当x和y所引用的对象是同一类对象且属性内容相等时(并不一定是相同对象),返回true否则返回false
3、那我们自己定义的类能否重写equals方法呢?可以,按照我们自己的要求进行比较
需求:在开发中要比较两个对象是否相同,经常会根据对象中的属性值进行比较,也就是在开发经常需要子类重写equals方法根据对象的属性值进行比较。如下代码演示:
示例:判断是否是同一只猫
只要猫的颜色、高度和体重相同就认为是同一只猫
public class TestEquals {
public static void main(String[] args) {
Cat c1 = new Cat(1, 2, 3);
Cat c2 = new Cat(1, 2, 3);
System.out.println(c1 == c2);
System.out.println(c1.equals(c2));
}
}
class Cat {
int color;
int height, weight;
public Cat(int color, int height, int weight) {
this.color = color;
this.height = height;
this.weight = weight;
}
@Override
public boolean equals(Object obj) {
if (obj == null) return false;
else {
if (obj instanceof Cat) {
Cat c = (Cat) obj;
if (c.color == this.color && c.height == this.height && c.weight == this.weight) {
return true;
}
}
}
return false;
}
}
注意:在复写Object中的equals方法时,一定要注意public boolean equals(Object obj)的参数是Object类型,在调用对象的属性时,一定要进行类型转换,在转换之前必须进行类型判断。
3.== 和 equals 的区别
3.1.==
- == 是运算符
- 可以使用在基本数据类型变量和引用数据类型变量中
- 如果比较的是基本数据类型变量:比较两个变量保存的数据是否相等
- 如果比较的是引用数据类型变量:比较两个对象的地址值是否相同(即两个引用是否指向同一个对象实体)
补充:使用时,必须保证符号左右两边的变量类型一致
3.2.equals() 方法的使用
- 一个方法,不是运算符,只能适用于引用数据类型
- Object 类中定义的 equals() 的方法:作用和 == 相同,比较两个对象的地址值是否相同
- 像 Date、String、File 包装类等都对 equals 方法进行了重写,重写之后比较的不再是引用的地址,而是比较两个对象的实体内容是否相同
- 通常情况下,自定义的类如果使用 equals 方法的话,通常是比较两个对象的实体内容是否相同。就需要对 equals 方法进行重写
4.toString方法
1、toString
方法返回该对象的字符串表示,其实该字符串内容就是对象的类型+@+内存地址值
。
getName() 以String形式返回类对象的名称(包换包名);
Integer.toHexString(hashCode()) 以对象的哈希码为参数,以16进制无符号整数形式返回此哈希码的字符串表示形式;
2、在我们直接使用输出语句输出对象名的时候,其实通过该对象调用了其toString()
方法. 但是toString
返回值的地址 对我们来说没有实际价值的
3、像 String、Date、File、包装类等都重写了 Object 类中的toString()方法。使得在调用toString()时,返回"实体内容"信息
4、由于toString
方法返回的结果是内存地址,而在开发中,经常需要按照对象的属性得到相应的字符串表现形式,因此也需要重写它。
下面是一个简单的例子:
package com.base.learn;
public class Customer {
private String name;
private int age;
public Customer(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
public String toString() {
return "Customer{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
5.hashCode()方法
public int hashCode()
a、返回该对象的哈希码值。默认情况下,该方法会根据对象的地址来计算。
b、不同对象的,hashCode()
一般来说不会相同。但是,同一个对象的hashCode()
值肯定相同。
c、不是对象的实际地址值,可以理解为逻辑地址值。
//import java.lang.Object; //java.lang 包下的类,导入语句可以省略不写
public class MyTest{
public static void main(String[] args) {
//java.lang
//Object 所有类的顶层父类,所有类都是直接或间接继承自他
Object obj= new Object();
System.out.println(obj);
//a:返回该对象的哈希码值。默认情况下,该方法会根据对象的地址来计算。
int i = obj.hashCode();
System.out.println(i);
Object obj2 = new Object();
System.out.println(obj2);
int i1 = obj2.hashCode();
System.out.println(i1);
//不同对象的哈希码值,是不一样的。
}
}