接口(interface)
接口的使用:
1)接口使用interface
来定义。
2)在java
中,接口和类是并列的两个结构。
3)如何定义接口:定义接口中的成员。
JDK7
及以前:只能定义全局常量和抽象方法。
- 全局常量:
public static final
(可省略) - 抽象方法:
public abstract
(可省略)
JDK8
:除了定义全局常量和抽象方法之外,还可以定义静态方法、默认方法。
- 接口中定义的静态方法,只能通过接口来调用。
- 通过实现类的对象,可以调用接口中的默认方法。
- 如果实现类重写了接口中的默认方法,调用时,则是重写后以后的方法。
- 如果子类(或实现类)继承的父类和实现的接口中声明了同名同参的方法,那么子类在没有重写此方法的情况下,默认调用父类中的同名同参的方法。(类的优先原则)
- 如果实现类实现了多个接口,而多个接口定义了同名同参的默认方法,那么在实现类没有重写此方法的情况下,报错。
→接口冲突(这就需要我们必须在实现类中重写此方法) - 如何在子类(或实现类)的方法中调用父类、接口中被重写的方法。
// 调用接口中默认的方法
CompareA.super.method3();
CompareB.super.method3();
4)接口中不能定义构造器,意味着接口不可以实例化。
5)java
开发中,接口通过让类去实现(implements
)的方式来使用。
如果实现类覆盖了接口的抽象方法,则此实现类就可以实例化。
如果实现类没有覆盖接口的抽象方法,则此实现类仍是一个抽象类。
6)java
类可以实现多个接口 → 弥补了java
单继承的局限性。
格式:class AAextends BB implements CC,DD,EE
public class InterfaceTest {
public static void main(String[] args) {
System.out.println(Flyable.MAX_SPEED);//7900
System.out.println(Flyable.MIN_SPEED);//1
Plane plane = new Plane();
plane.fly();//通过引擎起飞
}
}
interface Flyable{
//全局常量
public static final int MAX_SPEED = 7900;//未省略
int MIN_SPEED = 1;//省略
//抽象方法
public abstract void fly();//未省略
void stop();//省略
}
interface Attackable{
void attack();
}
class Plane implements Flyable{
@Override
public void fly() {
System.out.println("通过引擎起飞");
}
@Override
public void stop() {
System.out.println("驾驶员减少起飞");
}
}
abstract class Kite implements Flyable{
@Override
public void fly() {}
}
class Bullet extends Object implements Flyable,Attackable{
@Override
public void attack() {}
@Override
public void fly() {}
@Override
public void stop() {}
}
7)接口与接口之间可以继承,而且可以多继承。
interface AA {
void method1();
}
interface BB {
void method2();
}
interface CC extends AA,BB {}
8)接口的具体使用,体现多态性。
9)接口可以看做是一种规范。
public class USBTest {
public static void main(String[] args) {
Computer computer = new Computer();
// 创建了接口的非匿名实现类的非匿名名对象
Flash flash = new Flash();
computer.transferData(flash);
System.out.println("************************");
// 创建了接口的非匿名实现类的匿名名对象
computer.transferData(new Printer());
System.out.println("************************");
// 创建了接口的匿名实现类的非匿名名对象
USB phone = new USB() {
@Override
public void start() {
System.out.println("手机开始工作");
}
@Override
public void stop() {
System.out.println("手机结束工作");
}
};
computer.transferData(phone);
System.out.println("************************");
// 创建了接口的匿名实现类的匿名名对象
computer.transferData(new USB() {
@Override
public void start() {
System.out.println("MP3开始工作");
}
@Override
public void stop() {
System.out.println("MP3结束工作");
}
});
}
}
class Computer {
public void transferData(USB usb) {
usb.start();
System.out.println("具体传输数据的细节");
usb.stop();
}
}
interface USB {
public abstract void start();
void stop();
}
class Flash implements USB{
@Override
public void start() {
System.out.println("U盘开始工作");
}
@Override
public void stop() {
System.out.println("U盘结束工作");
}
}
class Printer implements USB {
@Override
public void start() {
System.out.println("打印机开始工作");
}
@Override
public void stop() {
System.out.println("打印机开始工作");
}
}