一:接口定义
1:语法格式
定义接口使用interface修饰符。
[修饰符] interface 接口名{
//接口成员
}
实现接口使用implement关键字。
public 类名 implement 接口名{
实现方法
普通方法
属性
}
一个类可以实现多个接口,各接口之间用逗号分隔。
接口的实现类允许包含普通方法。
在实现抽象方法时需要指定public权限,否则会产生编译错误。
实现接口的类必须实现接口中所定义的所有抽象方法,即使这个类中不使用,也要实现。通常用空方法体实现子类不需要的抽象方法。如果是有返回值的,就让其返回默认值。
2:实例
public interface USBInterface {
public static final String NAME = ""; //静态常量
public void service();
}
接口中的方法默认是抽象方法,所以可以省略abstract修饰符。
接口中的方法默认都是由public修饰的,所以可以省略public;
接口中的变量只能是静态变量(static final),所以可以省略static final。
且静态变量在定义时就需要赋值,且不可变。
二:JDK8.0中接口的新特性:
1:default方法
在 jdk8.0 中 default 关键字可用于在接口中修饰方法(默认方法), default 修饰的方法可以有具体实现,也只能在接口中出现。 default 修饰的方法可以被重写。 默认方法可以在不破坏已经在使用该接口的所有代码。默认方法有时也称为防御方法
2:static方法。
static修饰的方法称为静态方法。static方法使用接口名.方法直接调用。即使是这个接口被另外一个接口继承时,这个方法也不能被调用。
三:抽象类和接口的区别:
1:继承 抽象类只能单继承,而接口可以实现多继承。
2:实现 抽象类中,子类通过使用extends继承抽象类。在接口中,子类通过implements实现多个接口。
3:成员 抽象类中可以有实例成员,静态成员和抽象方法,抽象类中的成员方法不能用default来修饰。
在接口中,只能有常量,抽象方法。以及在JDK8.0版本以后可以有static和default方法。
4:成员变量修饰符 抽象类中可定义变量,也可定义常量。接口中只能定义常量(public static final 修饰的变量)
5:构造函数 抽象类可以有构造函数。接口中不能定义构造函数。
6:最高层 类的最高层是Object。接口没有最高层。
7:访问权限 接口中默认是public修饰的,public可以省略。 抽象类可以为protected或包访问修饰符。
8:相同点 两者都不能实例化。两者都是引用类型。两者都可以包含抽象方法。
四:lambda方法
接口中有一种特殊的接口,这类接口中只有一个抽象方法。我们把这种接口称为函数式接口(FunctionalInterface) 可以使用 @FunctionalInterface 标记函数接口 函数接口表示某个功能(能力)
函数式接口的匿名类写法可以使用 lambda
来简写.
@FunctionalInterface
interface IType {
void test();
}
class Demo{
public static void main(String[] args){
// 通常使用 匿名类
IType a = new IType(){
@Override
public void test(){
// 实现
}
};
// lambda
IType b = () ->{
// 实现
};
}
}
如果lambda
中实现只有一句代码则可以省略 {}
这种写法java
可以根据变量的类型推断出匿名类实现的接口,以及重写的方法。 方法写法上:
- 如果方法没有参数则使用
()
表示。 - 如果有参数, 则需要在
()
写形参列表,在实现中可以使用这些参数。- 参数的类型可以省略,可以推断出参数类型
- 如果只有一个参数则
()
可以省略
五:克隆
1:浅克隆
对象中的引用数据类型的字段是同一个引用 [默认]
@Override
public Dog clone() throws CloneNotSupportedException {
return (Dog) super.clone();
}
2:深克隆
将对象中的引用数据类型也复制一份
@Override
protected Person clone() throws CloneNotSupportedException {
// return (Person) super.clone();
Person copy = (Person) super.clone();
// 将引用数据类型 clone 一份, 再设置
Dog copyDog = copy.getDog().clone();
copy.dog = copyDog;
return copy;