接口

接口:比抽象类还要抽象得彻底的“抽象类”(DK8以后新增了静态方法和默认方法(default修饰的方法))

  • 接口中常量定义时,可以不写public static final,缺省有。接口中方法定义时,可以不写public abstract,缺省有。接口只定义不变的内容(常量和抽象方法)。
  • 一个类可以实现多个接口(implements),接口不能new一个对象,但是可用于声明引用变量类型。接口可以继承另一个接口(extends),而且支持多继承。一个类实现一个接口,必须实现之中所有方法,并且方法只能是public的。

接口的实现

声明接口

1
2
3
4
5
[public] interface 接口[extends 父接口列表]
{
[public] [static] [final] 数据类型成员变量=常量值;
[public] [abstract] 返回值类型成员方法[(参数列表)];
}

接口不能被实例化!
举个栗子:

1
2
3
4
5
6
7
8
9
10
public interface Area //可计算面积接口
{
public abstract double area(); //计算面积
}

public interface Perimeter
{
public abstract double perimeter();
//抽象方法,计算周长
}

声明实现接口的类

[修饰符] class 类<泛型> [extends 父类] [implements 接口列表]
例子:

1
public abstract class ClosedFigure extends Figure implements Area, Perimeter

实现接口的非抽象类必须实现所有接口中的所有抽象方法,否则声明为抽象类

接口多继承

接口是引用数据类型

1
2
3
4
5
6
7
8
9
ClosedFigure fig = new Ellipse(point,10,20);//父类对象fig引用椭圆子类实例
Area ar = fig; //Area接口对象ar引用实现Area接口的
ClosedFigure类的Ellipse子类实例
ar.area() //运行时多态
Cylinder cylinder = new Cylinder(fig,10); //椭圆柱
ar = cylinder; //ar引用实现Area接口的Cylinder类的实例
Volume vol = cylinder; //Volume接口对象vol引用实现Volume接口的Cylinder类的实例
ar.area() //运行时多态
vol.volume()

接口与抽象类的区别

内部类和内部接口

概念

声明在其他类或接口内部的内嵌类型。

1
2
3
4
public class Pixel //像素类,外层类型,外部类{
public static interface ColorConstant//颜色常量接口,静态内部接口,类型嵌套
public static class Color extends Object implements ColorConstant//颜色类,静态内部类
}
1
Pixel.Color color = new Pixel.Color(255,255,255);

在实例内部类中,使用以下格式引用或调用外部类当前实例的成员变量或实例成员方法:
外部类.this.成员变量//引用外部类当前实例的成员变量
外部类.this.实例成员方法(参数列表)//调用外部类当前实例的成员方法

匿名内部类