Java基础——常用API4
一、object
1.1 简介


1.2 构造方法
object类是没有成员变量的,所以没有带参的构造方法,只有一个空参构造。很好理解,因为没有一个属性能做到是所有类别的共性。之前我们说针对一个任意的一个类的构造方法,默认访问父类的无参构造,而不是访问有参构造的原因便可由此看出原因。

1.3 成员方法

涉及很多后面的知识点,这里只研究三个。

1.3.1 toString

其底层代码:

细节:直接打印得到的结果也是一样的,原因是:
认识一下输出语句:三部分
System: Java里的一个类名,之前学习过
out: 是System里面的一个静态变量。这里也体现了,静态变量和方法可以直接通过类名.静态变量或方法直接调用。
System.out:就可以获取到打印的对象。
println: 其实是一个方法,参数表示我们要打印的内容。



首先它会调用String里面的ValueOf()静态方法,把对象传递过去,点开ValueOf()底层实现方法,你就可以发现,本质上调用toString()!把对象变成了字符串。



这样之后输出的就不是地址值,而是默认初始化值。


1.3.2 equlas



思考题1:

1.3.3 Clone

package com.lkbhua.MyApi.Object;import java.util.StringJoiner;// Cloneable 接口内没有任何的抽象方法
// 如果一个接口没有没有抽象方法,那么这个接口就是标记接口
public class User implements Cloneable{private int id; // 游戏角色private String name; // 用户名private String password; // 密码private String path; // 游戏图片private int[] data; // 游戏进度public User() {}public User(int id, String name, String password, String path, int[] data) {this.id = id;this.name = name;this.password = password;this.path = path;this.data = data;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getPath() {return path;}public void setPath(String path) {this.path = path;}public int[] getData() {return data;}public void setData(int[] data) {this.data = data;}public String toString() {return "User{" +"id=" + id +", name='" + name + '\'' +", password='" + password + '\'' +", path='" + path + '\'' +", data=" + arrToString() +'}';}public String arrToString() {StringJoiner sj = new StringJoiner(",", "[", "]");for (int i = 0; i < data.length; i++) {sj.add(data[i] + "");}return sj.toString();}@Overrideprotected Object clone() throws CloneNotSupportedException {// 调用父类中的clone方法// 相当于让Java帮我们克隆一个对象,并把克隆之后的对象返回出去。return super.clone();}
}
package com.lkbhua.MyApi.Object;public class UserTest {public static void main(String[] args) throws CloneNotSupportedException {// 1、创建一个对象int[] data = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0 };User u1 = new User(1, "lkb", "123456", "girll", data);// 2、克隆对象// 不能直接调用u1.clone();// 因为底层的代码是protected受保护的,只能在本类中使用// 而我们想要使用,只能通过重写的方法。Object u2 =(User)u1.clone();// 方法会在底层帮我们创建一个对象,并且把原对象中的数据拷贝过去。// 1、重写Object中Clone()方法// 2、让JavaBean类实现Cloneable接口// 3、创建源对象并调用clone()方法System.out.println(u1);System.out.println(u2);}
}

字符串存储在串池当中,而数组有另外的空间,他们本质上都是引用数据类型,所以存储的都是地址值,只有id是存储真实值1。
Java中的克隆有俩种方式。
第一种:对象克隆单一,首先会创建一个新的对象,然后基本数据类型就是将真实的数据拷贝,引用数据类型是拷贝地址值。专业称之为—— 浅克隆或者浅拷贝。
缺点:修改其一,新数组跟着被该。

第二种方式:首先对创建一个新的对象,关于基本数据类型的拷贝方式是一样的,但是关于引用数据类型就不一样了,它不再拷贝源数据的地址值,而是会创建一个新的对象,比如就data数组来说,会把原来数组的元素拷贝到新的数组,而这个数组的地址值会放到克隆的data中。两者之间互相不影响。


重写Object中Clone()的浅克隆的方法。
@Overrideprotected Object clone() throws CloneNotSupportedException {// 调用父类中的clone方法// 相当于让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();// 因为父类中的Clone方法是浅克隆,所以替换克隆出来对象中的数组地址值u.data = newData;return u;}在真正以后开发的时候,我们克隆是会使用第三方工具的。
// 步骤
1、第三方写的代码导入到项目中

回到IDEA中,在当前模块下新建一个包,叫lib是library的缩写。表示以后使用别人的代码,都放到这个包中。选中它之后,Ctrl + D, 点击OK。

点击该文件,右键,倒数第三个Add as Libray,后点击“OK”。

发现能打开这个别人写代码文件了,可以利用起来了。

2、编写代码


二、Objects


学习了Objects之后就可以直接通过Objects调用.equals方法,传入带比较对象即可,不需要自己书写判断是否为null的逻辑。

底层代码:



底层代码:


声明:
以上均来源于B站@ITheima的教学内容!!!
本人跟着视频内容学习,整理知识引用
