Object类是Java中的顶级父类。所有的类都直接或者间接的继承与Object类
Object类中的方法可以被所有子类访问,所以我们要学习Object类和其中的方法
Object的构造方法
public Object() 只有无参构造方法
也就能解释子类的super()是默认访问无参构造,因为Object只有无参构造方法
Object成员方法
public String toString() 返回对象的字符串表示形式
public Boolean equals(Object obj) 比较两个对象是否相等
protected Object clone(int a) 对象克隆
toString()方法介绍:
public class Object类 {
public static void main(String[] args) {
Student1 stu = new Student1("张三",18);
//1.toString 返回对象的字符串表示形似
//默认情况下toString返回到是地址值
//System.out.println(stu.toString());//Student@10f87f48
//如果我们不想要地址值,可以重写toString方法
System.out.println(stu.toString());//student{name='张三', age=18}
}
}
class Student1 {
private String name;
private int age;
public Student1() {}
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;}
public Student1(String name, int age) {this.name = name;this.age = age;}
//重写toString方法,右键--生成--选中toString即可对他重写;
@Override
public String toString() {
return "student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
还有一种情况,就是打印类名,也会出现地址值,是因为当我们打印一个对象的时候,底层会调用对象的toString方法,把对象变成字符串
equals(Object obj)方法介绍:
import java.util.Objects;
public class Object类 {
public static void main(String[] args) {
Student1 stu1 = new Student1();
Student1 stu2 = new Student1();
//未重写equals方法
boolean result1 = stu1.equals(stu2);//false
//equals底层逻辑仅仅只是比较地址值,stu1和stu2的地址值不一样,所以说false
System.out.println(result1);
Student1 stu3 = new Student1("张三",18);
Student1 stu4 = new Student1("李四",23);
//如果我们不想要比较地址值,需要比较他们里面的值,那么我们就要重写equals
//重写之后equals方法
boolean result2 = stu3.equals(stu4);
System.out.println(result2);//true
}
}
class Student1 {
private String name;
private int age;
public Student1() {}
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;}
public Student1(String name, int age) {this.name = name;this.age = age;}
//重写equal,右键--生成--点击equals()和hashCode(),hashCode用不上可以删掉
//这样比较的就是内容的值了
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student1 student1 = (Student1) o;
return age == student1.age && Objects.equals(name, student1.name);
}
}
我们再看一道equals面试题
public class ObjectDemo {
public static void main(String[] args) {
String s = "csdn";
StringBuilder sb = new StringBuilder("csdn");
System.out.println(s.equals(sb));//false
//因为equals方法是被s调用的,而s是字符串
//所以equals要看String类中的equals
//String中重写了equals方法
//如果这个类型是String则返回ture
//如果不是String类则返回false
//但是我们比较的不是String,是StringBuilder类,所以返回的是false
System.out.println(sb.equals(s));//false
//因为因为equals方法是被sb调用的,而sb是StringBuilder类
//所以这里的equals要看StringBuilder类的equals方法
//又因为StringBuilder没有equals方法,继承的是Object中的equals方法
//Object中的equals方法比较的是地址值,所以返回的是false
}
}
Object clone(int a)方法介绍:
Object clone(int a)简称对象克隆,就是把A对象的属性完全拷贝给B对象,也叫对象拷贝,对象复制
使用场景:
类似于王者荣耀的转区,lol的转区,基于这个实现
使用方法:
public class Clone类 {
public static void main(String[] args) throws CloneNotSupportedException {
//1.首先新建一个对象
User u1 = new User("张三","12321421");
//2.克隆对象
//重写clone方法
//方法会在底层帮我们创建一个对象,并把原对象的数据拷贝过去
//书写格式
User u2 = (User) u1.clone();
System.out.println(u1);
System.out.println(u2);
}
}
//Cloneable是一个标记性接口,表示当前的class类可以被克隆
//如果没有则不能被克隆
class User implements Cloneable{
private String name;
private String passwrod;
public User(String name, String passwrod) {
this.name = name;
this.passwrod = passwrod;
}
@Override
public String toString() {
return "User{" + "name='" + name + '\'' + ", passwrod='" + passwrod + '\'' + '}';
}
//重写clone方法
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
Java克隆中有两种方式
浅克隆
深克隆
Object中的克隆是浅克隆
如果想使用深克隆,那么我们得重写Clone方法
这个实现起来的思路,就是获取变量的值然后赋值给另一个变量,再返回,深克隆就是这样
Objects工具类
equals方法:
isNull和nonNull方法: