在 Java 中,可以通过两种形式来达到抽象的目的,一种是抽象类,另外一种就是接口。
《《《《一个类只能继承一个抽象类,但却可以实现多个接口。》》》》》
接口是通过 interface 关键字定义的,它可以包含一些常量和方法。
public interface Electronic {
// 常量
String LED = "LED";
// 抽象方法
int getElectricityUse();
// 静态方法
static boolean isEnergyEfficient(String electtronicType) {
return electtronicType.equals(LED);
}
// 默认方法
default void printDescription() {
System.out.println("电子");
}
}
1)接口中定义的变量会在编译的时候自动加上 public static final
修饰符,也就是说 LED 变量其实是一个常量。【换句话说,接口可以用来作为常量类使用,还能省略掉 public static final
】
2)没有使用 private
、default
或者 static
关键字修饰的方法是隐式抽象的,在编译的时候会自动加上 public abstract
修饰符。也就是说 getElectricityUse()
其实是一个抽象方法,没有方法体——这是定义接口的本意。
3)静态方法无法由(实现了该接口的)类的对象调用,它只能通过接口的名字来调用,比如说 Electronic.isEnergyEfficient("LED")
。
02、定义接口的注意事项
-
接口中允许定义变量
-
接口中允许定义抽象方法
-
接口中允许定义静态方法(Java 8 之后)
-
接口中允许定义默认方法(Java 8 之后)
1)接口不允许直接实例化。
2)接口可以是空的,既不定义变量,也不定义方法。
3)不要在定义接口的时候使用 final 关键字,否则会报编译错误,因为接口就是为了让子类实现的,而 final 阻止了这种行为。
4)接口的抽象方法不能是 private、protected 或者 final。
5)接口的变量是隐式 public static final
,所以其值无法改变。
03、接口可以做什么
1)使某些实现类具有我们想要的功能
2)Java 原则上只支持单一继承,但通过接口可以实现多重继承的目的。
3)实现多态。===【就是同一个事件发生在不同的对象上会产生不同的结果,】
多态的存在 3 个前提:
1、要有继承关系,Circle 和 Square 都实现了 Shape 接口
2、子类要重写父类的方法,Circle 和 Square 都重写了 name()
方法
3、父类引用指向子类对象,circleShape 和 squareShape 的类型都为 Shape,但前者指向的是 Circle 对象,后者指向的是 Square 对象。
04、接口与抽象类的区别
1)语法层面上
-
接口中不能有 public 和 protected 修饰的方法,抽象类中可以有。
-
接口中的变量只能是隐式的常量,抽象类中可以有任意类型的变量。
-
一个类只能继承一个抽象类,但却可以实现多个接口。