目录
1.接口
概念
不是类,而是一组需求。可看作没有实例字段的的抽象类,区别在于可继承多个父类,或者未接线的键盘。可用instanceof检测。
public
所有方法默认public;所有字段默认为public static final。
interface
创建一个接口。接口名字可跟随一个泛型类型,如Comprable<T>,实现类不指定时默认Object。
implement
使用一个接口。不同于接口方法,实现接口时需加public。可使用多个接口,用逗号分开。
可扩展
一个接口可extend令一个接口。
作用
接口便于使不同类的实体使用相同的外层函数。例子:只要实现Comparable接口就能使用Arrays.sort函数。
public class Son extends Father implements Comparable<Son>{
//...
@Override
public int compareTo(Son o) {
return Double.compare(this.getAge(),o.getAge());
}
}
@Test
void sonSort(){
var sons=new Son[2];
sons[0]=new Son(3,"a");
sons[1]=new Son(2,"b");
Arrays.sort(sons);
for(Son x: sons){
System.out.println("name="+x.getName());
}
}
//name=b
//name=a
static
接口中允许存在静态方法,但没必要。
default
方法前加default关键词可不必override。
冲突
只要使用的两个接口中有相同的方法,无论它们是否有默认的实现,都需override。
类优先
如果同时使用extend和implement,不会产生冲突,因为接口的default都会被忽略。
修改字符串排序方式
原来按字典顺序排序
import java.util.Comparator;
public class LengthComparator implements Comparator<String> {
@Override
public int compare(String o1, String o2) {
return o1.length()-o2.length();
}
}
@Test
void comparatorOperate(){
String[] str=new String[]{"application","dark"};
System.out.println(str[0].compareTo(str[1]));
System.out.println(new LengthComparator().compare(str[0],str[1]));
Arrays.sort(str,new LengthComparator());
System.out.println(Arrays.toString(str));
}
//-3
//7
//[dark, application]
clone
所有的数组类都有clone()方法。当想复制一个对象时,需使用Cloneable接口。
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class Person implements Cloneable{
private String name="unknown";
private int age=0;
private Date hireDay=new Date();
public Person clone(){
try{
Person p2=(Person)super.clone();
p2.hireDay=(Date) this.hireDay.clone(); //深拷贝
return p2;
}catch (CloneNotSupportedException e){
e.printStackTrace();
}
return null;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", hireDay=" + hireDay +
'}';
}
}
@Test
void cloneOperation(){
Person p1=new Person();
Person p2=p1.clone();
System.out.println(p1.toString());
System.out.println(p2.toString());
}
2.lambda表达式
当使用接口后只有一个override方法,这个类的实例对象可以更简单的创造。
@Test
void comparatorOperate(){
String[] str=new String[]{"application","dark"};
System.out.println(str[0].compareTo(str[1]));
System.out.println(new LengthComparator().compare(str[0],str[1]));
// Arrays.sort(str,new LengthComparator());
Comparator<String> comp=(String str1,String str2)->str1.length()-str2.length(); //comp是一个使用接口的具体类对象
System.out.println(comp.compare("alive","zero")); //等效
Arrays.sort(str,comp); //等效
// Arrays.sort(str,(String str1,String str2)->str1.length()-str2.length()); //String可省略,只有一个参数时括号可省略
System.out.println(Arrays.toString(str));
}