比抽象类更加抽象的是接口。接口是一系列方法的声明,是一些方法特征的集合。一个接口只有方法的特征而没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。接口是解决Java无法多继承的手段,但它在实际生产中更多的作用是制定标准。
在Java中,接口的声明使用的关键字是interface
,前面的修饰符是public
或省略。其中public
是公有访问级别,可以在任何地方访问;省略是默认访问级别,只能在当前包中访问。
在接口中成员变量都是静态成员变量,省略了public static final
修饰符。声明抽象方法可以省略public
关键字。
某个类实现接口时,声明时使用implements
关键字,当实现多个接口时,接口之间用逗号分隔。实现接口时要实现接口中声明的所有方法。
例如有一接口IShape
,该接口有两个抽象方法getArea()
和getPerimeter()
,分别用于求图形的面积和周长,声明接口的代码如下:
interface IShape {
double getArea();
double getPerimeter();
}
下面创建一个六边形类RHexagon
,实现IShape
接口,重写getArea()
和getPerimeter()
方法,实现求六边形的面积和周长:
class RHexagon implements IShape {
private final double a;
public RHexagon(double a) {
this.a = a;
}
@Override
public double getArea() {
return 3 * Math.sqrt(3) / 2 * a * a;
}
@Override
public double getPerimeter() {
return 6 * a;
}
}
完整代码如下:
import java.util.Scanner;
import java.text.DecimalFormat;
interface IShape {
double getArea();
double getPerimeter();
}
class RHexagon implements IShape {
private final double a;
public RHexagon(double a) {
this.a = a;
}
@Override
public double getArea() {
return 3 * Math.sqrt(3) / 2 * a * a;
}
@Override
public double getPerimeter() {
return 6 * a;
}
}
public class Main {
public static void main(String[] args) {
DecimalFormat d = new DecimalFormat("#.####");
Scanner input = new Scanner(System.in);
double a = input.nextDouble();
IShape r = new RHexagon(a);
System.out.println(d.format(r.getArea()));
System.out.println(d.format(r.getPerimeter()));
input.close();
}
}