Java中常用类之Object类
Object类中的常用方法:
1.hashCode
方法,是对象地址值的另一种表现形式
class Student{
String name;
int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
}
测试类中是这样进行调用的:
public class ChangClass {
public static void main(String[] args) {
TestFu t1 = new TestFu("吴彦祖",35);
TestFu t2 = new TestFu("吴亦凡",34);
System.out.println(t1); //返回的是一个对象的地址值
System.out.println(t1==t2); //比较两个对象的地址值是否相同,相同返回ture,不相同返回false
System.out.println(t1.hashCode()); //hashCode方法表示是地址值的另一种表现形式,对象不同,其返回值也不同
}
}
getClass方法
System.out.println(t1.getClass()); //返回的是此Object的运行时类,获取当前的class文件对象,一个类全局只有一个在方法区中
toString方法:当我们直接写toString方法的时候,返回的是该对象的地址值,原因是Object类里面的toString方法返回的就是一个方法路径和对象地址值
那要是我们想返回里面具体的值怎么办?
所以我们需要重新该toString方法
public String toString() {
return "TestFu{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
alt加ins快捷键,再选择toString方法可以直接快速生成toString方法,再在测试类中去调用该方法
System.out.println(t1.toString());
System.out.println(t1);
这两种都可以
public boolean equals(Object obj)
之前我们学习equals是在判断语句中对String类型进行判断的。
当我们想要比较两个对象里面所传的属性一样就需要使用到这种方法
import java.util.Objects;
class Student2{
String name;
int age;
public Student2() {
}
public Student2(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Student2{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student2 student2 = (Student2) o;
return age == student2.age && Objects.equals(name, student2.name);
}
}
public class ObjectDemo3 {
public static void main(String[] args) {
Student2 s1 = new Student2("李刚", 21);
Student2 s2 = new Student2("李刚", 21);
//默认情况下,若对象类中没有自己编写equals方法,默认使用的是父类中Object类中的equals方法
//而父类中Object类中的equals方法底层调用的是==比较,若比较的是引用数据类型,比较的是地址值
//而我们这里s1和s2接受的是不同两个对象的地址值,所以默认比较的结果是false
// System.out.println(s1.equals(s2));这种写法只会表示两个对象的地址值
//需求:当对象的姓名和年龄一样的时候,表示是同一个学生
//比较的对象类中自己重写一个equals方法,自动生成即可
System.out.println(s1.equals(s2));
}
}
protected Object clone()
java中并不是所有的类都可以被克隆,只有授权的类的对象才可以使用克隆方法
我们通过阅读帮助文档后发现,若一个对象的类没有实现Cloneable接口的话,是不可以调用clone方法的
然后,我们再去看Cloneable接口的时候,发现该接口中没有任何抽象方法,今后像这样的接口称之为标记接口
克隆在IT行业中,称之为拷贝。
拷贝分为两种:
1、浅拷贝
2、深拷贝
在我们Object类中,这个克隆指的是浅拷贝,因为其中类里的变量不会单独
class Demo1 {
int a = 10;
}
class Student3 implements Cloneable {
String name;
int age;
Demo1 demo1;
public Student3() {
}
public Student3(String name, int age, Demo1 demo1) {
this.name = name;
this.age = age;
this.demo1 = demo1;
}
@Override
public String toString() {
return "Student3{" +
"name='" + name + '\'' +
", age=" + age +
", demo1=" + demo1 +
'}';
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
public class ObjectDemo4 {
public static void main(String[] args) throws Exception {
Demo1 d1 = new Demo1();
Student3 s1 = new Student3("刘亦菲", 36, d1);
System.out.println("s1: " + s1);
System.out.println(s1.hashCode());
// Student3 s2 = new Student3("章若楠", 21);
System.out.println("===========================================");
//首先,如果此对象的类不实现接口Cloneable ,则抛出CloneNotSupportedException 。
// Object o1 = s1.clone();
Object o1 = s1.clone();
System.out.println("o1: " + o1);
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律