接口:如果某个类遵从某个接口,那么它就要履行相应的服务,这里后半句的意思就是它必须重写所有的方法。注意接口和纯虚类一样绝对不可以被实例化,不能有实例域,但可以有常量,里面的方法自动设置成public,常量是public static final。
为什么要多此一举去弄一个接口,而不是利用之前的纯虚类呢,那是因为java在类中只能单继承,而接口当中可以多继承,所以你会看到implents多个接口。
类优先规则:在你同时继承类和实现接口的时候,如果它们两当中都定义了同一个方法,并且在接口中是默认方法,那么基于类优先规则,接口中的方法会被忽略。
深拷贝与浅拷贝:
问题引入:为一个包含对象引用的变量建立副本时会发生什么?我们知道对象变量都是堆中某个对象实例的引用,可以粗略地理解为指针。下面看一个代码:
Employee original = new Employee("John Public", 50000);
Employee copy = original;
copy.raiseSalary(10);
我们知道copy去执行完这个方法后原来original这个变量引用的对象所包含的salary值也发生了变化。
那么怎么实现两个对象变量的引用相互隔离呢?我们可以使用clone方法来克隆!
Employee copy = original.clone();
copy.raiseSalary(10);
这样一来original这个变量引用的对象的salary值不会改变。你以为这就完了吗?让我们考虑更加复杂的情况,如果实例域当中的是对象变量呢?那么你复制过来的依然是原来的引用,依然实现不了隔离!
可以看出,hireDay引用的还是同一个对象,没有实现隔离。通常子对象都是可变的, 必须重新定义 clone 方法来建立一个深拷贝, 同时克隆所有子对象。这里说的深拷贝就是把hireDay和name重新拷贝一份在堆上,而不只是拷贝一份引用。



