Clonable接口和深拷贝
java中内置了一些很有用的接口,Clonable就是其中之一
Object类中存在一个clone方法,调用这个方法可以创建一个对象的“拷贝”,但是想要合法调用clone方法,必须要先实现Clonable接口,否则就会抛出CloneNotSupportedException异常。
Object类是所有对象的直接或间接的父类
该类具备所有对象都具备的功能
Object类中已经提供了对对象是否相同的比较方法
标记接口
cloneable函数本身就是一个标记接口,意思是实现了它,就可以使用克隆方法了,我们在类当中重写clone函数,其实是重写的Object类当中的clone()函数,这样我们在子类当中才能使用clone函数
class Money
{public double money;
}
class Student implements Cloneable
{//cloneable接口什么内容都没有//作用是什么?//这个接口是标记接口,实现了该接口,证明当前类是可以被克隆的public int age;public Money m = new Money();//成员变量public Student(int age){this.age = age;}@Overridepublic String toString() {return "Student{" +"age=" + age +'}';}protected Object clone() throws CloneNotSupportedException{return super.clone();}}
public class Test {public static void main(String[] args) throws CloneNotSupportedException {Student student1 = new Student(10);student1.m.money = 19.9;Student student2 = (Student) student1.clone();}}
问题: Student student2 = (Student) student1.clone();为什么还得进行强制转型呢?
这是因为clone()函数的返回值是Object类型的,所以需要强制转型为Student。
Object类
默认是所有类的父类,默认会继承Object类,即所有类的对象都可以使用Object的引用进行接受。
范例:使用Object接受所有类的对象
问题:当类中的私有变量设置完,并进行初始化以后为什么还需要getter和setter,原因是什么?
getter 和 setter 最主要的目的是控制变量的访问权限,实现封装,外部类 无法直接访问或修改 这些变量,必须通过 getter
和 setter
进行访问。
匿名内部类
这个匿名内部类,直接被实例化了,但是没有名字,也没办法再次调用
重载和重写的区别
同一个类之中,方法名称相同,参数不同,我们称之为重载;重写发生在继承当中,当子类继承了父类之后,将这个函数复制过去之后,内容进行了更改,我们可以将之称为重写。