Object这个类是Java中顶级的父类,所有的类都直接或者间接的继承于Object类
他没有成员变量,也就没有带参的构造方法
所以在继承结构中,父类下的super()就解释的通了
我们要知道Object中常见的方法
第一个我们要知道toString这个方法,用于返回当前对象的字符串的表示形式,我们来看一下源代码,这个源代码的意思是返回:类所在的软件包名+类名+@+类在堆空间的地址(对象的地址值)
我们用代码来实现一下
我们想让他不打印当前对象的字符串形式怎么办?
我们学继承的时候都应该知道,如果父类的方法满足不了子类的需求,那我们在子类中重写父类的方法
我们来看一下代码:
小细节:这里我们要知道我们打印对象的名字的时候,打印的是他的地址,其实是java底层自动调用了toString方法
我们来看一下代码:
这两个的输出的结果是不是一样啊
那么问题来了,我们想打印对象名的时候不想让他打印地址怎么办?
上面不是说了吗,如果父类的方法满足不了子类,那么就在子类中重写这个方法,那么他在自动调用这个方法的时候就打印的我们重写后的这个方法
我们用代码实现一下:
第二个我们要知道equals这个方法
我们先看一下源代码
我们子类的对象调用这个方法的时候,这个方法是他的父类中的方法,这里this依旧代表是调用者的子类的对象,==是比较的是地址
我们看一下代码,最后的结果肯定是false,因为他比较的是地址,两个对象的地址肯定不一样
我们不想比较地址,我们想比较里面属性的信息怎么办,我们依旧可以利用重写方法来进行修改
我们看一下重写后的方法和输出的结果吧
第三个我们要知道clone()这个方法
方法是克隆
1.浅克隆
注意:我们使用这个方法的时候,我们要注意他的修饰符是被protected修饰的,我们知道被protected修饰的类只能在本包中使用和在别的软件包的子类中使用
因为他是lang包下的,所以我们不能在测试类中调用这个方法,但是我们可以重写这个方法,在这个重写后的方法的里面间接的访问父类,因为不同包的子类中可以访问父类的受保护的成员和方法,我们在测试类中调用这个方法,在方法内部调用父类的这个方法,这属于内部实现,因为子类的方法中要遵循子类的规则,这个方法属于子类的一部分所以可以调用父类的
我们看一下重写后的这个方法
但是我们直接使用这个方法进行克隆会报错
这是因为我们还没有是实现一个接口,这个接口没有抽象方法,他作用只是标记这个类
我们来看一下正确的代码
在这里我来解释一下克隆的前面为什么要强制转换,这是因为这个方法返回的是Object的对象,是父类的对象,我们要向下转型,转成子类
这是浅克隆,浅克隆的意思是,原来的对象的引用数据里面的值发生改变,克隆后的值也发生了改变,我们来看一下源代码
2.深克隆
深克隆就不会拷贝原对象的引用数据类型里面的数据了,他会重新创建一个数组,如果是字符串会复用
实现步骤,在克隆的重写方法中改变,我们来看一下代码的实现
看一下结果
但是这太麻烦了,并且数组还是地址,还是引用数据类型
我们可以利用第三方工具进行深克隆(其实就是别人写好的代码,我们拿来直接用)
下载地址:
通过网盘分享的文件:gson-2.6.2.jar
链接: https://pan.baidu.com/s/18XhGEzgGqBzdSVw8EcQa7w 提取码: jg6j
使用教程:
1.下载并复制到我们直接的这个模块中
2.右键点击选择倒数第三个增加到库
3.创建对象使用
我们直接看代码
接下来我们看一下大厂的面试题
问这段代码最后输出什么,为什么?
我们来解释一下
我们先看String类中的equals的源代码
第一个if判断比较的是判断是地址(也就是判断是否为同一个对象),如果是同一个对象直接返回true
第1950行,比较的是anObject这个对象(也就是传过来的那个对象)是否为字符串如果不是字符串直接返回false,如果是字符串,在比较字符串里面的内容,如果一样返回true,不一样返回false
这里我们传过来的是StringBuilder的对象sb,是一个地址,所以直接返回false
我们再看StringBuilder类中的equals的源代码
很简单比较的是本类和传过来的那个类的对象的地址值
肯定不一样,所以返回的是false