Java中Object类的使用(附加一个Java大厂面试题)

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值