一.Object
Object是Java中的顶级父类,所有类都直接或者二间接的继承Object类。
Object类的方法可以被所有子类访问。
一.Object的构造方法:
没有带参构造,只有一个空参构造
原因是在Java中只有子类的共性才会往父类中抽取,但是Object是Java中的顶级父类,没有一个属性是所有子类都有的,所以没有成员变量,自然没有带参构造方法。
二.Object的成员方法:
1.toString();
对于打印结果java.lang.Object@776ec8df
java.lang是包名
Object是类名
@是固定合适
776ec8df是对象的地址值
toString();的源代码
当我们直接打印时
我们发现调用方法和不调用方法打印结果一样
是因为printfln();方法的源代码里面也有一个toString();
因为默认情况下Object类中的toString方法返回地址值
所以我们打印的就是地址值。
当我们想要得到属性时,就要重写toString;
我们创建一个Student类,重写toString方法
此时我们再次创建对象,就可以打印内部的属性值。
总结:
如果我们打印一个对像想要看到属性值,只需要重写toString方法,返回值把属性拼接即可。
我们可以使用ptg插件自动完成
2.equals();
比较两个对象是否相等。
举个例子
为什么输出false呢?
首先我们没有在Student里面重写equals所以要看Object类中的源代码
可以发现他是使用==来进行判断的,==判断的是地址值,所以输出false。、
而我们一般比较地址值。
当我们父类方法不能满足需求,就要重写方法
我们在Student中按下ALT+INS
重写之后就比较属性值了
结论:如果没有重写equals方法,默认比较地址值
当我们需要比较属性值,就要去重写
小练习:
思考一下,输出的是什么
可以看到全是false
因为第一个被s调用,s是字符串,所以在String中的toString的源代码
他表示先判断是否为字符串,如果是字符串在比较内部属性,如果不是则直接返回false;
第二个调用者sb是StringBuilder。
所以要看StringBuilder中的toString,因为StringBuilde里面并没有重写toString方法,所以默认调用Object类中的toString方法
而这里sb 和 s地址值不同,所以返回false
两个返回虽然都是false,但是原因不同。
3.clone();
对象克隆,把A对象的属性值完全拷贝给B对象,也叫对象拷贝,对象复制。
我们先创建有以下属性的Javabean类
我们无法直接通过对象调用clone方法,要在Student中重写
并且添加一个接口
对于这个接口
我们可以开始克隆
关宇克隆对象
方法会在底层帮我们创建一个对象,并把原来的对象拷贝过去
书写细节
1.重写Object类中的clone
2.让你的Javabean类实现Cloneable接口
3.创建原对象并调用clone既可以了。
Java的克隆有两种方式
第一种:浅克隆/浅拷贝
这种拷贝方式
对于基本数据类型,直接把属性值拷贝过去
对于引用数据类型,是把地址值拷贝过去,(字符串/数组等等)
对于数组而言,两个对象指向一个数组,这样会有一个特点
当其中一个对象进行修改,另外一个也会更改
第二种:深克隆/深拷贝
这种拷贝方式
对于基本数据类型,直接把属性值拷贝过去
因为字符串只要不是new出来的就会在串池进行管理,所以会进行复用
对于数组(和其他引用数据类型)而言会在创建一个数组,把数组的值拷贝过去(新的与原来的互不干涉)
系统默认就是浅克隆
进行深克隆的方法:使用第三方工具gson