接口
-
和抽象类不同,定义接口使用interface修饰符
-
接口的访问权限与public和包访问权限,与类类似
-
接口可以多继承,它继承父接口中定义的常量和方法
-
接口的成员变量声明
-
[public] [static] [final] 数据类型 成员变量名 = 常量;
-
接口中的成员变量默认是[public] [static] [final]
-
-
接口中的成员方法声明
-
[public] [abstract] 返回值类型 方法名称(参数列表);
-
接口中的成员方法默认是[public] [abstract]
-
定义一个接口
public interface 接口名{ // 接口成员 }
实现接口
实现接口需要注意
-
一个类可以实现多个接口,各接口之间用逗号分隔
-
实现接口的类必须实现接口中定义的所有抽象方法,即使不使用也必须实现它,通常用空方法实现子类不需要的方法,如果抽象方法有返回值,可返回默认值
-
接口的实现类中允许包含普通方法
-
在实现抽象方法时需要指定public,否则编译错误
public 类名 implements 接口名... { //接口内方法的实现 }
实现一个接口和它的实现类
public interface USB { void fun(); } class TypeC implements USB{ /** * USB接口的实现 */ @Override public void fun() { System.out.println("实现了TypeC接口"); } public static void main(String[] args) { TypeC typec = new TypeC(); typec.fun(); } }
多继承接口的语法
[修饰符] interface 接口名 extends 父接口1,父接口2...{ 定义方法 }
JDK8.0之后接口新特性
default关键字
default关键字,在接口中修饰方法(称为默认方法),default修饰的方法可以包含方法体
// 实现 public interface charge { default void show() { System.out.println("正在充电"); } void add(); } class demo implements charge{ /** * 实现接口中的add方法 */ @Override public void add() { System.out.println("增加电量"); } public static void main(String[] args) { demo dem = new demo(); dem.show(); dem.add(); } }
!注意
接口的默认实现方法是可以被子类覆盖的,也可以不被子类覆盖。子类不覆盖时可以直接调用默认方法。
如果一个类实现两个接口,这两个接口又同时包含一个名字相同的default方法,在这种情况下,编译器会报错,实现类必须是重写接口的抽象方法。
static关键字
static方法通过接口名.方法名直接调用
public interface charge { default void show() { System.out.println("正在充电"); } void add(); static void full() { System.out.println("电量已充满"); } } class demo implements charge{ /** * 实现接口中的add方法 */ @Override public void add() { System.out.println("增加电量"); } public static void main(String[] args) { demo dem = new demo(); dem.show(); dem.add(); charge.full(); } }
JDK9.0之后增加特性
方法的访问修饰符可以声明为private
方法修饰为private
public interface Eat { private void beef() { System.out.print("吃牛肉"); }; default void noodles() { beef(); System.out.println("面"); } String eat(String name); } class person implements Eat{ /** * @param name * @return */ @Override public String eat(String name) { return "人吃" + name; } public static void main(String[] args) { person p = new person(); p.noodles(); System.out.println(p.eat("方便面")); } }
接口和抽象类的区别
特性 | 抽象类 | 接口 |
---|---|---|
多继承 | 子类只能继承一个直接抽象类(单继承) | 接口可以继承多个父类接口 |
实现 | 子类通过extends 继承抽象类 | 子类通过implements 实现多个接口 |
成员修饰符 | 抽象类可以定义变量,也可以定义常量 | 接口中只能定义常量(public static final 修饰的变量)default接口的默认方法 static修饰的可以通过接口名.静态方法名 |
子类实现 | 子类在实现抽象方法时不允许缩小访问权限 | 子类在实现抽象方法时必须指定public 权限 |
构造函数 | 抽象类可以有构造函数,但不能进行实例化 | 接口中不能定义构造函数 |
最高层 | 类的最高层是Object 类 | 接口没有最高层 |
想同点
-
两者都不能实例化
-
都是引用类型
-
都包含抽象方法