Object类

1. 基本介绍

Object类是Java默认提供的一个类,Java里除了Object类,所有的类都是存在继承关系的,如果没有直接继承的父类,默认会继承于Object父类,也就是说Object类的引用可以接收所有类的对象,即Object类是Java中的顶级父类。

2. 常见方法

在Object类中存在一些常用方法,如下:

2.1 hashCode()

hashCode()方法会帮我们计算一个具体的对象位置,也就是说hashCode()方法是用来确定对象在内存中的存储位置的,我们看一下hashCode方法的源码:

java 复制代码
//native方法是本地方法,底层有c/c++代码实现,我们看不到具体实现细节
public native int hashCode();
java 复制代码
//输出不同对象的哈希码值

//Person.java
public class Person {
	public String name;
	public Person(String name) {
		this.name = name;
	}
}

//Main.java
public class Main {
	public static void main(String[] args) {
		Person person1 = new Person("张三");  
		Person person2 = new Person("李四");  
		Person person3 = new Person("李四");  
		System.out.println("person1的哈希码值:" + person1.hashCode());  
		System.out.println("person2的哈希码值:" + person2.hashCode());  
		System.out.println("person3的哈希码值:" + person3.hashCode());
	}
}

hashCode():返回当前对象的哈希码值,通过对象进行计算得到哈希码值,不同对象的返回值一般不同。

执行结果如下:

当我们认为两个名字相同的对象相同时,意味着我们认为两个名字相同的对象应当存储在一个位置,这时候我们需要重写hashCode()方法,让它根据我们所指定的规则判断对象在内存中的存储位置是否相同。

java 复制代码
//Person.java
public class Person {
	public String name;
	public Person(String name) {
		this.name = name;
	}
	//重写hashCode()
	@Override
	public int hashCode() {
		return Objects.hash(name);//根据名字来哈希,名字相同则认为他们存储在一个位置
	}
}

再次执行上述代码:

2.2 getClass()

getClass()方法可以获取一个字节码文件对象,即我们常说的Class对象,所以需要一个Class类来进行接收。

java 复制代码
public static void main(String[] args) {
	Person person1 = new Person("张三");  
	Person person2 = new Person("李四");  
	Person person3 = new Person("李四");  
  
	Class class1 = person1.getClass();  
	Class class2 = person2.getClass();  
	Class class3 = person3.getClass();  
  
	System.out.println("class1的字节码对象是:" + class1);  
	System.out.println("class2的字节码对象是:" + class2);  
	System.out.println("class3的字节码对象是:" + class3);
}

执行结果如下:

从执行结果我们发现我们用不同Person对象获得的Class对象是相同的,这也就是说一个类在 JVM 中只会有一个 Class 实例(字节码文件对象)。

#注: java文件被编译后,生成了.class文件,JVM此时就要去解读.class文件,被编译后的.class文件会被JVM解析为一个对象。

2.3 toString()

我们在输出一个对象时,编译器会默认调用我们的toString()方法。

java 复制代码
//当我们输出一个Person对象时
Person person = new Person("张三");  
System.out.println(person);

我们会得到以下运行结果:

这个结果到底是如何出现的呢?

我们发现编译器底层会自动帮我们调用toString()方法,但是我们在输出一个对象的时候往往希望能够得到一个关于本对象的信息,而不是一串不能直接获取当前对象信息的值,因此我们在使用toString()方法时,通常需要在Object子类中重写这个方法。

java 复制代码
public class Person {  
    public String name;  
    //方法  
    public Person(String name) {  
        this.name = name;  
    }  
    //重写toString()
    @Override  
    public String toString() {  
        return "Person{" +  
                "name='" + name + '\'' +  
                '}';  
    }  
  
    @Override  
    public int hashCode() {  
        return Objects.hash(this.name);  
    }  
}

在Person类中重写toString()方法后得到的结果如下:

2.4 equals()

Object类中的equals()方法默认比较的是两个对象的引用,相同返回true,不同返回false

java 复制代码
//equals()源码如下:
public boolean equals(Object obj) {  
    return (this == obj);  
}

//执行如下代码:

Person person1 = new Person("张三");

Person person2 = new Person("张三");

System.out.println(person1.equals(person2));

执行结果如下:

通过情况下我们将姓名相同的两个人认为是一个人,也就是说我们希望equals()方法返回的结果是true;这就需要我们在person类中实现对equals()方法的重写

java 复制代码
public class Person {  
    public String name;  
	//重写equals()
    @Override  
    public boolean equals(Object obj) {  
        Person o = (Person)obj;  
        return this.name.equals(o.name);  
    }  
  
    //方法  
    public Person(String name) {  
        this.name = name;  
    }  
  
    @Override  
    public String toString() {  
        return "Person{" +  
                "name='" + name + '\'' +  
                '}';  
    }  
  
    @Override  
    public int hashCode() {  
        return Objects.hash(this.name);  
    }  
}

重写后运行结果如下:

2.5 clone()

Object类中存在这一个clone方法,调用这个方法可以创建一个对象的"拷贝"。

前面文章中我们对这个方法进行了详细介绍,在这里就不多介绍了

3. 总结

对于Object类中常见的方法,根据我们实际操作过程中的要求经常需要对这些常见方法进行重写(Override),所以实际上在定义一个类的时候,我们会将Object类中常使用的方法进行重写。

相关推荐
Swift社区37 分钟前
从 JDK 1.8 切换到 JDK 21 时遇到 NoProviderFoundException 该如何解决?
java·开发语言
DKPT2 小时前
JVM中如何调优新生代和老生代?
java·jvm·笔记·学习·spring
phltxy2 小时前
JVM——Java虚拟机学习
java·jvm·学习
seabirdssss3 小时前
使用Spring Boot DevTools快速重启功能
java·spring boot·后端
喂完待续3 小时前
【序列晋升】29 Spring Cloud Task 微服务架构下的轻量级任务调度框架
java·spring·spring cloud·云原生·架构·big data·序列晋升
benben0443 小时前
ReAct模式解读
java·ai
轮到我狗叫了4 小时前
牛客.小红的子串牛客.kotori和抽卡牛客.循环汉诺塔牛客.ruby和薯条
java·开发语言·算法
Volunteer Technology5 小时前
三高项目-缓存设计
java·spring·缓存·高并发·高可用·高数据量
栗子~~5 小时前
bat脚本- 将jar 包批量安装到 Maven 本地仓库
java·maven·jar