1、接口
接口使用关键字interface来定义。接口和类相似,分为接口声明和接口体。
接口中只有常量和抽象方法。
接口中定义常量始终使用的修饰符:public、static、final(允许省略)
接口中定义方法始终使用的修饰符:public、abstra(允许省略)
2、接口实现
接口由类使用关键字implements来实现。一个类可以实现多个接口(用逗号隔开接口名)例如:
class A implements B,C;
抽象类可以重写接口中的方法,也可以直接拥有接口中的方法。
接口可以实现多继承。
接口不能实例化。
public interface A {
int max = 46;
int f(int x);
}
public class B implements A { //B类实现了接口A
int number;
@Override
public int f(int x) {
int sum = 0;
for (int i = 1; i < x; i++){
sum = sum + i;
}
return sum;
}
}
public class C implements A {
int number;
@Override
public int f(int x) {
return max + x; //直接使用接口中的常量
}
}
public class Main {
public static void main(String args[]){
B b = new B();
C c = new C();
b.number = 32 + A.max; //用接口名访问接口常量
c.number = 14 + A.max;
System.out.println(b.number);
System.out.println(c.number);
System.out.println(b.f(100));
System.out.println(c.f(1));
}
}
输出结果为:
E:\JavaIDE\jdk-9.0.4_windows-x64_bin\bin\java "-javaagent:E:\JavaIDE\Javaanzhuang\IntelliJ IDEA Community Edition 2017.3.3\lib\idea_rt.jar=3230:E:\JavaIDE\Javaanzhuang\IntelliJ IDEA Community Edition 2017.3.3\bin" -Dfile.encoding=UTF-8 -classpath E:\workplace\out\production\InstanceTest interface1.Main
78
60
4950
47
Process finished with exit code 0
由以上例子可以说明(1)程序可以使用接口名直接访问接口中的常量。
(2)如果一个类实现了接口,则可以再类体中直接使用接口的常量。
3、接口回调
由于接口不能实例化,所以当声明了一个接口变量的时候,如果想要调用接口方法,则需要将实现这个接口的类的对象的引用赋值给该接口变量,此时,接口变量就可以调用被类实现的接口方法。此时,就实现了接口的回调。
public interface A {
void a(String s);
}
public class B implements A {
@Override
public void a(String s) {
System.out.println(s);
}
}
public class C {
public static void main(String args[]){
A a; //声明接口变量
a = new B(); //将对象的引用赋值给接口变量
a.a("hello"); //接口回调
}
}
输出结果为:
E:\JavaIDE\jdk-9.0.4_windows-x64_bin\bin\java "-javaagent:E:\JavaIDE\Javaanzhuang\IntelliJ IDEA Community Edition 2017.3.3\lib\idea_rt.jar=3236:E:\JavaIDE\Javaanzhuang\IntelliJ IDEA Community Edition 2017.3.3\bin" -Dfile.encoding=UTF-8 -classpath E:\workplace\out\production\InstanceTest CallBack.C
hello
Process finished with exit code 0
7、为什么有了接口还需要abstract类
(1)abstract类和接口都可以有abstract方法
(2)接口只能有常量,不能有变量;而abstract类既可以有常量,也可以有变量。
(3)abstract类中也可以有非abstract方法,接口不可以。
(4)abstract类可以提供了子类可以继承的变量和非abstract方法。如果考虑到需要使用继承一些变量和非abstract方法,就可以考虑使用abstract类。