接口
关键词:interface,implements
- 多继承:一个类可以继承多个接口 注:但是java是单继承的
- 每个实现类必须实现接口的所有方法
- 接口中不能有实例域和静态方法
- 不能实例化接口
- 可以声明接口的变量
- 接口可以有常量
- 接口的方法默认被声明为public ,接口的域被自动设置为public static final且不能设置为其他类型
在一个类同时继承一个父类和实现一个接口,发生冲突时,类优先
克隆
浅拷贝:对每个域进行拷贝,包括相同子对象的引用。导致克隆对象和员对象会公用子对象的应用
深拷贝:将原对象的子对象也拷贝,使其克隆对象的子对象和原对象的子对象不再是同一个引用。
深拷贝方法:
- 实现cloneable接口
- 重新定义clone方法,并指定public访问修饰符
即便是默认的浅拷贝能够满足要求,还是需要实现cloneable接口,将clone定义为public,然后调用super.clone()
class A implements Cloneable{
public A clone() throws CloneNotSupprtedException{
return (A)super.clone();
}
}
深拷贝例子:
Class A{
B b;
public A clone() throwsCloneNotSupprtedException{
A cloned=(A)super.clone();
choned.b=(B)b.clone();
return cloned;
}
}
Comparator接口
为啥要说这个接口呢,其实是有利于对接口的一种很好的利用的理解,不单单只是简单的实现。
static class LengthComparator implements Comparator<String> {
public int compare(String first, String second) {
return first.length() - second.length(); }
}
public static void main(String[] args) {
String[] abc={"abc","bc","cccc","daffff"};
Arrays.sort(abc);
System.out.println(Arrays.toString(abc));
Arrays.sort(abc,new LengthComparator());
System.out.println(Arrays.toString(abc));
}
以下是结果。
可以发现其实我们只是重写了Comparator,没有对sort进行一个修改,我们就可以直接利用sort()的功能了。这就是接口的一种经典用法。
简单说,我们履行了接口的义务(实现了接口),我们就能拥有接口的很多权力(比如这里sort())。
lambda表达式
为什么我把lambda表达式放在这里呢。因为事实上,在jdk1.8之后匿名内部类的实现就可以用lambda表达式,这里只是顺带提一句。我会在内部类的相关知识里面用实例介绍的。