Object是Java中的顶级父类,所有的类都直接或者间接的继承于Object
Object类中的方法可以被所有子类访问,所以我们要学习Object类和其中的方法
Object的构造方法:只有一个空参构造
Object的成员方法
toString 返回对象的字符串表示形式
Object obj=new Object(); String str1=obj.toString(); System.out.println(str1);//java.lang.Object@1d251891 //细节 System.out.println(); //System:类名 //out:静态变量 //System.out获取打印的对象 //println:方法 //核心逻辑:当我们打印一个对象的时候,底层调用toString,把对象转化为字符串 //默认情况下,toString方法返回的是地址值,所以默认情况下,打印一个对象打印的就是地址值,如果 // 我们想看到打印对象的属性值 // 处理方案:重写父类中的toString方法 //结论:如果我们打印一个对象,想要看到属性值,就重写toString方法
equals方法
//equals比较的是地址值 //如果要比较两个对象里面的属性值 //就要对Object里面的equals进行重写
//equals比较的是地址值 //如果要比较两个对象里面的属性值 //就要对Object里面的equals进行重写 String s = "abc"; StringBuilder sb = new StringBuilder("abc"); System.out.println(s.equals(sb));//false //字符串里的equals方法先判断是不是字符串, //如果是字符串,再比较内部属性 //如果不是,直接返回false System.err.println(sb.equals(s));//false /* * sb调用的equals,但是StringBuilder没有重写,所以继承 * Object,默认比较地址值 * * */
对象克隆
把A对象的属性值完全拷贝给B对象,也叫做对象拷贝,对象复制
//Cloneable //如果一个接口里面没有抽象方法 //表示当前接口是一个标记性接口 //现在Cloneable表示一旦实现,那么当前类的对象可以被克隆 //如果没有实现,就不能克隆 public class User implements Cloneable{
成员变量
构造方法
GS方法
@Override public String toString() { return id+","+Username+","+password+","+path+","+arrToString(); } public String arrToString(){ StringJoiner stringJoiner=new StringJoiner(",","[","]"); for (int i = 0; i < data.length; i++) { stringJoiner.add(data[i]+""); } return stringJoiner.toString(); } @Override protected Object clone() throws CloneNotSupportedException { //调用父类中的克隆方法 //相当于让Java自己帮我们克隆,并返回 return super.clone(); } }
package Object; public class Demo3 { public static void main(String[] args) throws CloneNotSupportedException { //protected Object clone(int a) 对象克隆 //先创建一个对象 int[] data={1,2,3,4,5,6,7,8,9,10}; User u1=new User(1,"sb","sb","aasda",data); //克隆对象 //是受保护的, User u2=(User) u1.clone(); System.out.println(u1); System.out.println(u2); } }
克隆分为浅克隆和深克隆
浅克隆:不管对象内部的属性是基本数据类型还是引用数据类型,都完全拷贝过来
深克隆:基本数据类型拷贝过来,字符串复用,引用数据类型会重新创建新的
@Override protected Object clone() throws CloneNotSupportedException { //调用父类中的克隆方法 //相当于让Java自己帮我们克隆,并返回 //深克隆 //先把被克隆的对象中的数组获取出来 int[] data = this.data; //创建新的数组 int[] newdata = new int[data.length]; //拷贝 for (int i = 0; i < data.length; i++) { newdata[i] = data[i]; } //调用父类中的方法克隆对象 User u = (User) super.clone(); //父类中的克隆是浅克隆 //替换数组 u.data = newdata; return u; }
Objects
boolean flag = Objects.equals(s1,s2);//先做非空判断,比较两个对象 细节 方法的底层会判断是否为空,如果为空直接返回flase 如果不为空,调用类里面的equals方法,如果没有重写,比较地址值 如果重写了,比较属性值 boolean flag1 = Objects.isNull(s1);//判断对象是否为空,为true,反之false boolean flag2 = Objects.nonNull(s1);//判断对象是否为空,与isNull的结果相反