01 常用API
02 Object类
02_01 常用方法
【1】public String toString()
① 功能:以字符串的形式返回对象的地址。
② 说明:当我们用sout直接打印对象(会默认调用toString方法),或对象.toString()的返回值时返回的是对象的地址,而我们其实并不希望得到对象的地址而是想到得到对象的内容,这时候我们可以在子类中重写toString方法,返回的结果将是表示对象内容的字符串,此时如果再用sout打印对象,或打印对象.toString()方法的返回值时,根据就近原则调用的将是子类中重写的toString方法。
③ 意义:让子类重写,以便返回子类对象的内容。(快捷方式:toS)
【2】public boolean equals()
① 功能:比较两个对象的地址是否相等。
② 说明:当我们想要比较两个对象是否是同一个对象时并不会调用Object类中的equals方法,而是会使用==直接去比较。
③ 意义:所以在开发中Object类的equals方法存在的意义也是供子类重写,从而让Object类的equals方法的功能变为,比较两个对象的内容是否相等。(快捷方式:eq,然后一直回车)
【3】protected Object clone()
① 功能:复制一个一模一样的新对象返回。
② 关于protected修饰符的说明:它可以在同一个类中/同包下/不同包下的子类中被访问得到。关于在不同包下的子类能访问到指的是,在子类中可以直接访问被protected关键字修饰的成员变量/方法,而对于在子类中new一个继承同一个父类的子类对象,然后通过该子类对象调用父类被protected修饰的方法是不可以的。
③ 说明:在Main类的main方法中实例化子类对象A,通过子类对象A是不能直接调用Object类中的clone方法的,因为Object类中的clone方法被protected修饰,要想访问该方法要么在Object类中,要么在Object类同包下的不同类中,要么在不同包下的子类中,而此时Main方法虽然是Object类的子类,但我们实例化出的对象并不是Main类的对象,对于在Main类中new一个继承同一个父类的子类对象,然后通过该子类对象调用父类被protected修饰的方法是不可以的。那我们该如何让对象A调用Object类中的clone方法呢?答:在子类中重写Object类的clone方法(protected Object clone()),由于Main类和子类所在同一个包下,所以我们可以在Main类中通过子类对象A访问到子类中被重写的clone方法的。
④ 做法:第一步:给需要clone的对象其对应的类实现Cloneable接口(不是泛型接口),解释:Cloneable接口是一个标记接口,里面没有任何的东西,用于标记某个类是否具有clone的能力。第二步:在该类中重写clone方法(为什么要重写上面已经说过了,因为Object的clone方法被protected修饰,无法访问到)。第三步:在使用clone方法的地方,抛出异常。第四步:在接收clone出来的结果时,由于clone方法的返回值是Object类型的,所以在接收之前需要强转一下。
⑤ 深拷贝做法:在浅拷贝基础上,将子类重写的clone方法中进行改造,示例如下图:将浅拷贝的结果强制类型转换后,找到引用类型的成员变量,让引用类型的成员变量调用clone方法,并将clone出来的引用类型的成员变量赋值给浅拷贝出来的对象的相关引用。
02_02 浅拷贝
02_03 深拷贝
03 Objects类
03_01 问题引入
03_02 常用方法
【回答问题】:为什么官方要使用Objects类中的equals方法来比较两个对象的内容是否相等?
答:因为假如在将来某个对象为null,那么它直接去调用方法时会出现空指针异常,而使用Objects类中的equals方 法它不仅不会抛空指针异常,而且会返回正确的值。
04 包装类
04_01 简单了解
【解释】:
① 将基本数据类型的数据转换成对应包装类类型的数据:对应包装类类名.valueOf()
② 装箱和①的效果一致,拆箱就是把包装类型的数据转换成基本数据类型的数据。
04_02 常用方法
【1】将基本数据类型的数据转为字符串:基本数据类型的数据 + ""
【2】将包装类型的数据转为字符串:
① 包装类名.toString(包装类型数据) ---》借助的是包装类自己的方法,这个也适用于基本类型
② 包装类型数据.toString() ----》借助的是Object类的toString方法
【3】将字符串类型的数值转为数值本身对应的基本数据类型,例如:包装类名.parseInt(字符串)
【4】将字符串类型的数值转为数值本身对应的包装类类型,包装类名.valueOf(字符串)
【注意】:如果字符串类型的数值是小数,使用parseInt或valueOf是不能转成整型/Integer类型的!!!!
05 StringBuilder类
06 StringBuffer类
07 案例:返回任意整型数组的内容
【提示】:要先判断数组对象不为null
public static String getArrayData(int[] array) {// 1. 判断数组对象是否存在if (array == null) {return null;}// 2. 数组对象存在,开始遍历数组进行拼接StringBuilder sb = new StringBuilder("[");for (int i = 0; i < array.length; i++) {if(i < array.length - 1) {sb.append(array[i] + ", ");} else {sb.append(array[i] + "]");}}return sb.toString();}public static void main(String[] args) {int[] array = {12,3,45};System.out.println(getArrayData(array));}
08 StringJoiner类
【解释】:这个的使用例如07的案例,我们在拼接的过程中就可以不用写if语句调整格式了,而是在创建StringJoiner时直接指定元素之间的间隔符和整个拼接结果的开始结束符。