接口是一种“引用数据类型”,编译之后也是一个class字节码文件,它是完全抽象的(抽象类是半抽象的),也可以说接口是特殊的抽象类。
1、接口定义:
【修饰符列表】 interface 接口名 {}
2、接口支持多继承,一个接口可以继承多个接口。
3、接口中只包含两部分内容,一部分是常量,一部分是抽象方法。
4、接口中所有元素都是public ,都是公开的。
5、接口中的抽象方法定义时,public abstract可以省略。
6、接口中的方法都是抽象方法,所以接口中的方法不能有方法体。
以下代码帮助理解:
public class Test2 {
public static void main(String[] args) {
System.out.println(Math.PI);
}
}
//定义接口
interface A{
}
//接口支持继承
interface B extends A{
}
//一个接口可以继承多个接口,支持多继承
interface C extends A,B{
}
interface Math{
//抽象方法
public abstract int sum(int a,int b);// public abstract可以省略
//常量
public static final double PI = 3.1415926;//public static final可以省略
}
7、类与类之间叫做继承,类与接口之间叫做实现(但是仍然可以将实现看作:“继承”)
继承使用关键字 extends 完成
实现使用关键字 implements 完成
注:当一个非抽象的类实现接口的话,必须将接口中所有的抽象方法全部实现(覆盖,重写), 重写的权限修饰符要大于等于,缺省的权限小于public。
以下代码帮助理解:
class C{
public static void main(String[] args) {
//编译错误,因为A是抽象类的,无法实例化
//new A();
A a = new B();
int result1 = a.sum(2,4); //调用接口里面的方法,面向接口编程
System.out.println(result1);
int result2 = a.sub(6,2);
System.out.println(result2);
}
}
interface A{
double PI = 3.1415926;
int sum(int a, int b);
int sub(int a, int b);
}
class B implements A{
public int sum(int a, int b) { //public必须写
return a + b;
}
public int sub(int a, int b) {
return a - b;
}
}
8、接口与接口之间支持多继承,一个类可以同时实现多个接口。
以下代码帮助理解:
class A {
public static void main(String[] args) {
B b = new E();
C c = new E();
D d = new E();
//调用其他接口的方法,需要转型(接口转型)
C c1 = (C)b;
c1.m2();
}
}
interface B{
void m1();
}
interface C{
void m2();
}
interface D{
void m3();
}
class E implements B,C,D {
//实现B接口的m1
public void m1() {
}
//实现C接口的m2
public void m2() {
}
//实现D接口的m3
public void m3() {
}
}
注:接口与接口之间在进行强制转换的时候,没有继承关系,也可以强转,但是运行时可能会出现异常,需要加 if + instanceof 进行判断
9、继承和实现都存在的话,代码应该怎么写?
extends 关键字在前,implements 关键字在后
以下代码帮助理解:
public class Test3 {
public static void main(String[] args) {
Flyable f = new Pig();
f.fly();
}
}
//动物类:父类
class Animal{
}
interface Flyable{
void fly();
}
//Flyable是一个接口,是一个翅膀的接口,通过接口插到猪的身上,猪就可以飞了
class Pig extends Animal implements Flyable{
public void fly(){
System.out.println("飞猪");
}
}
运行结果为:



