六、常用类
1、Object类
- 所有类的父类
- 因为所有类都继承了Object类,因此省略了extends Object关键字
- Object中的属性和方法就具有通用性
- Object只声明了一个空参构造器
主要方法
- toString()
- getClass()
- equals()
- clone()
- finalize()
- 注意:Object类中的getClass(),notify(),notifyAll(),wait()等方法被定义为final类型,因此不能重写
clone()
- 复制对象
- 先分配一个和源对象同样大小的空间,在这个空间中创建一个新对象
Java语言中创建对象的方法
- 使用New操作符创建一个对象
- 使用clone方法复制一个对象
Clone和new创建对象的区别
- new:本意是分配内存。首先根据new操作符后面的类型分配对应大小的内存空间,在调用构造函数,填充对象的各个域(即初始化)。调用完构造方法后,一个对象创建完毕。将其引用(地址)发布到外部,即可在外部使用。
如 Student stu = new Student();
new Student()即创建对象,Student stu代表用一个Student类型的对象接收创建好的新对象返回的地址- clone():
- 第一步和new类似,都是分配内存。
- 调用clone()方法时,分配的内存和源对象(即调用clone方法的对象)相同
- 然后再使用源对象中对应的各个域,填充新对象的域。填充完成后,clone方法返回,一个新的相同的对象被创建。
- 简单来说,就是通过clone方法创建一个和源对象类型相同的对象,按照源对象的规范要求新对象
- 注意:调用clone()方法的对象必须实现Cloneable接口,重写clone()方法
- Clone()方法是被protected的,保证只有类里面才能克隆该类对象
Clone与copy的区别
- copy只是简单的指向了同一片内存地址,修改其中的属性时两个对象都会受到影响
Studentstu=newStudent();
Studentxiaoming=stu; // 指向同一片地址
xiaoming.setAge(18); // stu的age受到影响也变成了18
- clone:完全拷贝出一个地址不同的对象,修改时不会受到影响
Studentstu=newStudent();
//需要先实现接口
Studentxiaoming= (stu).clone(); // 生成一个和stu一样的方法,且指向不同地址
xiaoming.setAge(18); // stu的age不受影响
Shallow Clone浅克隆和Deep Clone深克隆
- 浅克隆:直接复制(让新对象的 属性/对象 指向源对象 属性/对象 的地址)
- 深克隆:再创建一个新的、相同的属性/对象给新对象(地址不同)
- clone方法执行的是浅拷贝(整体),如果有需要深拷贝的地方就要这个被引用的对象(部分)实现Cloneable接口并重写clone方法
类名 对象名 = (类名)super().clone()
使用Cloneable接口的clone()方法深拷贝
2、toString()方法
- 返回一个字符串,由类名、“@”和此对象哈希码的无符号16进制组成
publicStringtoString() {
returngetClass().getName() +"@"+Integer.toHexString(hashCode());
}
- 当我们输出一个对象的引用时,实际上调用的是当前对象的toString()
System.out.println(cust.toString);
System.out.println(cust);
- 此方法用的比较多,一般子类(String、Date、File等)都有覆盖(用于输出字符串值)
- 推荐在学习阶段,所有属性的类都加上toString()方法