Java-interface

  1. 定义接口:定义接口中的成员

    JDK7及以前:接口中只能定义全局常量和抽象方法:

    全局常量:public static final 的,但是在接口中书写时,可以省略不写;

    抽象方法:public abstract 的。

    JDK8:除了全局常量和抽象方法,还可以定义静态方法、默认方法,二者可以有方法体

    • 静态方法:只能通过接口来调用;

    • 默认方法:

      • 通过实现类的对象,可以调用接口中的默认方法;如果实现类重写了接口中的默认方法,调用时仍然调用的是重写后的方法;

      • 如果实现类实现了多个接口,而这多个接口中定义了同名同参数的默认方法,那么实现类在没有重写此方法的情况下会报错。——> 接口冲突。这就需要我们在实现类中重写此方法;

      • 如果子类(或实现类)继承的父类和实现的接口中声明了同名同参数的默认方法,那么子类在没有重写此方法的情况下,默认调用的是父类中的同名同参数方法。——>类优先原则

        注意:类优先原则仅针对方法,不包括属性,见下方面试题1

      • 规定:在子类(或实现类)的方法中可以调用父类、接口中被子类重写的方法,语法如下(见代码演示1):

        ​ super.testFunc(); //调用父类中声明的方法

        ​ 接口.super.testFunc(); // 调用接口中声明的默认方法

      • 静态方法及默认方法讲解视频

  2. 接口中不能定义构造器,意味着接口不能被实例化;

  3. Java开发中,接口通过让类去实现(implements)的方式来使用;

  4. 如果一个实现类中覆盖了接口中的所有抽象方法,则此实现类可以被实例化;

    如果实现类没有覆盖接口中的所有抽象方法,则此实现类仍为一个抽象类

  5. Java类可以实现多个接口 —> 弥补了Java单继承的局限性;

    格式:class AA extends BB implements CC,DD,EE

  6. 接口与接口之间可以继承,而且可以多继承

  7. 接口的四种实现方式:(匿名类与匿名对象)

接口面试题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
interface A {
int x = 0;
}

class B {
int x = 1;
}

public class C extends B implements A{
public void getX() {
// System.out.println(x); //编译不通过,对 'x' 的引用不明确,'B.x' 和 'A.x' 均匹配

System.out.println(A.x); // 0
System.out.println(super.x); // 1
}

public static void main(String[] args) {
new C().getX();
}
}

代码演示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class A extends B implements C{
public static void main(String[] args) {
new A().myMethod();
}
public void testFunc(){
System.out.println("A"); // A 重写了此方法
}
public void myMethod(){
testFunc(); // A (调用的是自己重写后的方法)
super.testFunc(); // B (调用的是父类中被重写的方法)
C.super.testFunc(); // C (调用的是接口中被重写的方法)
}
}
class B{
public void testFunc(){
System.out.println("B");
}
}
interface C {
default void testFunc() {
System.out.println("C");
}
}