接口的声明
java语言只支持单继承机制,不支持多继承。但若遇到复杂问题,单继承会给程序设计带来很多问题。Java语言使用接口解决这个问题。Java语言规定一个子类只能继承一个父类,能实现多个接口。通过接口可以指明多个类需要实现的一组方法。接口可以比抽象类更好地规范子类的行为,实现多态性但接口不能实现代码复用。
接口可以实现多继承,类只允许单继承。
声明接口时,需要使用interface关键字,其语法格式如下:
<public> <abstract> interface 接口名称 [extends父接口列表]{
<public> <static> <final> 变量名=初值; // 静态常量
<public> <abstract> 返回值 方法名([参数表]) throws [[异常列表];//抽象方法
说明:
①默认修饰符:其中用尖括号括起来的修饰符是是默认的修饰符,通常省略不写。
② 接口名称:接口的名字,有时还会在接口名宇字后加 able 或 ible 作为结尾,或者在名字前加一个字母“I”。
③ 多继承:可以使用extends来继承父接口,但但它与类中的extends不同,它可以有多个父接口,各父接口间用逗号“,”隔开。
④常量:接口可以有静态的公开常量,即用public static final加以修饰。接口不能有成变量,否则会因为多继承造成同名变量的问题。
⑤ 方法:接口中的所有方法都是抽象的和公开的,即用public abstract 修饰。
与抽象类一样,接口不能被实例化。
接口的实现
接口的定义格式:
接口一般以"I"开头。
[访问修饰符] interface 接口名[extends 接口1, 接口2, ...] {
常量
抽象方法
}
抽象类定义格式
public abstract class 类名 [extends 基类]{
成员变量
构造方法
getter与setter方法
普通方法
.....
abstract 方法
}
接口 | 抽象类 | |
区别 | 只包含常量及抽象方法 (JDK7之前) | 可以包含有一般成员,也可以包含有抽象方法。 |
成员默认为public的 | 成员可以是私有的、受保护的、内部的或公有的 | |
变量默认为final的 | 可以包含非final的变量 | |
抽象方法可以不加abstract,默认abstract | 抽象方法一定要加abstract | |
相同点 | 只能被继承,不能实例化 |
一旦定义了接口,会有一个或更多的类来实现这个接口。由于接口中只有静态常量和抽象方法,
故实现接口的类必须定义接口中的抽象方法。接口实现的语法格式为:
Class 类名 implements 接口名称{ // 接口的实现
//类体
}
例子:求给定圆的面积。
运行结果如下图所示:
注意:
一个类可以实现多个接口,在implements后列出需要实现的接口名。
如果某个类不是abstract类型,那么类要实现该接口的所有抽象方法。
在类中实现接口的抽象方法中,必须与接口中定义的方法头完全一致,即方法名、返回值类型及形参列表要完一致。如果方法名相同,但参数不同,则不是实现接口的抽象方法,而是定义新的方法。
public interface Shape2D {
double PI = 3.1415926; //定义静态常量PI
double area(); //定义求面积的抽象方法
}
public class Circlel implements Shape2D{
double radius;
public void setRadius(double radius){
this.radius = radius;
}
public double area(){
return PI*radius*radius;
}
}
public class InterfaceDemo {
public static void main(String[] args) {
Circlel c = new Circlel();
c.setRadius(10);
System.out.print("Circle area:"+c.area());
}
}
在一个接口时,如果接口中的某个抽象方法在类中没有实现,则该类是一个抽象类,不能生成
对象。
接口的继承
接口可以通过关键字 extends 继承其他接口。子接口将继承父接口中所有的常量和抽象方法。子接口的实现不仅要实现子接口的抽象方法,还要实现父接口的所有抽象方法。
例子:接口的继承
运行结果如下图所示:
public interface Shape3D extends Shape2D{
double volume();
}
public class Circlel2 implements Shape3D{
double radius;
public Circlel2(double radius){
this.radius = radius;
}
public double volume() {
return 4*PI*radius*radius*radius/3;
}
public double area(){
return PI*radius*radius;
}
}
public class InterfaceDemo2 {
public static void main(String[] args) {
Circlel2 c = new Circlel2(10);
System.out.println("circle area:"+c.area());
System.out.println("circle volume:"+c.volume());
}
}
例子: 实现多个接口。
运行结果如下图所示:
public interface Color {
void setColor(String str);
}
public class Circle3 implements Shape2D, Color {
String co1;
double radius;
public Circle3(double radius) {
this.radius = radius;
}
public static void main(String[] args) {
}
public String getColor(){
return co1;
}
public double area() {
return PI*radius*radius;
}
}
public class InterfaceDemo3 {
public static void main(String[] args) {
Circle3 c = new Circle3(10);
c.setColor("red");
System.out.println("circle area:"+c.area());
System.out.println("circle color:"+c.getColor());
}
}
接口新特性
分类
JDK7以前:接口中只能定义抽象方法
JDK8的新特性:接口中要以定义有方法体的方法。(默认、静态)
JDK9的新特性:接口中可以定义私有方法。
原因:只要接口中增加新的抽象方法,所有的实现类必须跟着改变,否则实现类会报错。
解决方法:在接口中增加有方法体的方法,实现类中不需要进行重写实现该接口。
使用场景:接口升级
JDK8新增方法
JDK8新增的方法:静态方法,使用static修饰
public interface Inter{
public static void show(){
System.out.println("借口中 的静态方法");
}
}
注意事项:
静态方法只能通过接口名调用,不能通过实现类名或对象名调用。
public可以省略,static不能省略。
静态方法不能重写,但实现类中可以写一个同名的静态方法。
JDK9新增方法
JDK9新增的方法:私有方法
普通私有方法,用于封装默认方法中的重复代码。
静态私有方法,用于封装静态方法中的重复代码。
public interface Inter{
public default void show1(){
System.out.println("show1方法");
show3();
}
public default void show2(){
System.out.println("show2方法");
show3();
}
private void show3(){
System.out.println("记录信息,有100行代码");
}
}
public interface Inter{
public static show1(){
System.out.println("show1方法");
show3();
}
public static show2(){
System.out.println("show2方法");
show3();
}
private static void show3(){
System.out.println("记录信息,有100行代码");
}
}
接口的特点
1.接口的特点
接口中的属性全部为公共静态常量, 方法全部是公共抽象方法。所以接口不能用new关键
字来创建实例,即不能被实例化。接口必须被类实现:
实现全部抽象方法,实现类成为普通的类。
不实现全部抽象方法,实现类成为抽象类。
接口是多继承的,同时类可以实现多个接口。
2.接口与抽象类的比较
接口与抽象类的区别如表所示:
抽象类 | 接口 | |
abstract 修饰符 | 不能省略 abstract 修饰符 | 省略abstrsct修饰符 |
子类和实现类 | 抽象类的子类继承 (extends) 抽象类,单继承 | 接口的实现类实现 (implements) 接口,多实现 |
继承 | 单继承 | 多继承 |
变量和方法 | 除抽象方法外,有成员变量,也可以有普通方法 | 只能有抽象方法和静态常量 |
复用 | 实现代码的复用 | 不能实现代码的复用 |