合规国际互联网加速 OSASE为企业客户提供高速稳定SD-WAN国际加速解决方案。 广告
接口类似于类,但接口的成员没有执行体,它只是方法、属性、事件和索引符的组合而已。接口不能被实例化,接口没有构造方法,没有字段。在应用程序中,接口就是一种规范,它封装了可以被多个类继承的公共部分。 ## 1、定义接口 Java 接口的定义方式与类基本相同,不过接口定义使用的关键字是 interface,接口定义由接口声明和接口体两部分组成。语法格式如下: ``` [public] interface 接口名 [extends 接口1, [接口2, ...]] { // 声明常量 [public] [static] [final] 数据类型 常量名 = 常量值; // 声明方法 [public] [abstract] 返回值类型 方法名称(参数列表); } ``` > 提示:如果接口本身被定义为 public,则所有的方法和常量都是 public 型的。 ## 2、接口成员——抽象方法和常量 接口对于其声明、变量和方法都做了许多限制,如下: * 具有 public 访问控制符的接口,允许任何类使用;没有指定 public 的接口,其访问将局限于所属的包。 * 方法的声明不需要其他修饰符,在接口中声明的方法,将隐式地声明为公有的(public)和抽象的(abstract)。 * 在 Java 接口中声明的变量其实都是常量,接口中的变量声明,将隐式地声明为 public、static 和 final,即常量,所以接口中定义的变量必须初始化。 * 接口没有构造方法,不能被实例化。 * 一个接口不能够实现另一个接口,但它可以继承多个其他接口。子接口可以对父接口的方法和常量进行重写。 ``` public interface MyInterface { String name; // 不合法,变量name必须初始化 int age = 20; // 合法,等同于 public static final int age = 20; void getInfo(); // 方法声明,等同于 public abstract void getInfo(); } ``` 【选择】阅读下面的 Java 代码,能够填写在(1)处的语句是()(选择一项) ``` public interface ILog { //(1) } ``` ``` A private int MAX_LOG_SIZE = 1000; B public void printLog() { System.out.println("print the log"); } C private boolean saveToFile(String fileName); D int getSize(); ``` 【选择】下列关于 Java 中接口的说法不正确的是()(选择一项) ``` A 接口中方法的访问修饰符默认为 public B 接口中的方法如果写成 void test(); 的形式,默认是抽象方法 C 实现接口的类中在重写接口中方法时访问修饰符可以为 protected D 当类实现接口时,需要实现接口中所有的抽象方法,否则需要将该类设置为抽象类 ``` 【选择】运行下列代码时,哪个位置会发生编译报错()(选择一项) ``` interface A { // (1) public static final int TEMP; // (2) public abstract void info(); // (3) } ``` ``` A 位置一 B 位置二 C 位置三 D 不存在错误 ``` ## 3、接口成员——默认方法和静态方法 默认方法可以通过实现接口的类实例化的对象来调用。需要注意的是,此处的静态方法只能被`public`修饰(或者省略不写),不能是`private`或者`protected`。 ``` public interface MyInterface { // 默认方法 default void hello () { System.out.println("say hello"); } // 静态方法 static void world() { System.out.println("say world"); } } public class Test implements MyInterface { public static void main(String[] args) { Test test = new Test(); test.hello(); // 调用默认方法 MyInterface.world(); // 调用静态方法 } } ``` 【选择】在实现类中划线处加入下列哪条代码可以调用 IAa 接口中默认的方法()(选择一项) ``` public interface IAa { default void show() { System.out.println("我是默认方法"); } } public class B implements IAa { public void show() { _______________ System.out.println("重写默认方法"); } } ``` ``` A IAa.show(); B super.show(); C IAa.super.show(); D B.super.show(); ``` 【选择】下列代码的运行结果是()(选择一项) ``` public interface IA { int TEMP = 10; } public interface IB extends IA { String TEMP = "temp"; } public class Test implement IA, IB { public static void main(String[] args) { IA a = new Test(); IB b = new Test(); System.out.print(a.TEMP); System.out.println(b.TEMP); } } ``` ## 4、接口的实现 接口被定义后,一个或者多个类都可以实现该接口,这需要在实现接口的类的定义中包含 implements 子句,然后实现由接口定义的方法。实现接口的一般形式如下: ``` <public> class <类名> [extends 父类] [implements 接口1 [, 接口2...]] { // ... } ``` 如果一个类实现多个接口,这些接口需要使用逗号分隔。实现接口的方法必须声明为 public,而且实现方法的类型必须严格与接口定义中指定的类型相匹配。 【编程】使用接口的知识,定义接口 IFLY,创建三个类 Plane 类、Bird 类、Balloon 类,分别重写接口中的 fly() 方法,然后再测试类中进行调用。程序运行参考效果如图所示: ``` 飞机在天上飞 小鸟在天空翱翔 气球飞上天空 ``` ``` public class Test { public static void main(String[] args) { // 1. 对象实例化 // 2. 分别调用 fly() 方法 } } public interface IFly { // 创建方法 fly() } // 实现接口 IFly public class Plane { // 重写 fly 方法 } // 实现接口 IFly public class Bird { // 重写 fly 方法 } // 实现接口 IFly public class Balloon { // 重写 fly 方法 } ```