接口的声明格式 :
权限修饰符(public/default) interface 接口名{
}
说明:
1.接口和类是并列存在的关系。
2.接口不能被实例化
3.接口中只能常量和抽象方法(JDK1.8之前)
4.接口和接口之间是继承关系而且是多继承。 接口1 extends 接口2,接口3.......
5.类和接口的关系是实现关系而且是多实现。 类 implments 接口1 ,接口2.......
6.类实现接口后必须重写接口中所有的抽象方法,如果不想重写那么该类可以变成抽象类
7.接口和类之间的多态性
/*
* 接口与类的多态性
* 接口的类型指向实现类的对象
*/
interface USB{
void start();
void close();
}
interface Bluetooth{
void connect();
void disconnect();
}
class Printer implements USB, Bluetooth{
@Override
public void start() {
System.out.println("-----打印机开始工作------");
}
@Override
public void close() {
System.out.println("-----打印机停止工作------");
}
@Override
public void connect() {
System.out.println("打印机蓝牙已连接");
}
@Override
public void disconnect() {
System.out.println("打印机蓝牙已断开");
}
}
class Mouse implements USB{
@Override
public void start() {
System.out.println("鼠标开始运行");
System.out.println("---灯亮了---");
}
@Override
public void close() {
System.out.println("鼠标停止运行");
System.out.println("---灯灭了---");
}
}
class Computer1{
public void runUSB(USB usb){
usb.start();
System.out.println("---------");
usb.close();
}
public void runBluetooth(Bluetooth bt){
bt.connect();
System.out.println("---------");
bt.disconnect();
}
}
public class USBTest {
public static void main(String[] args) {
Computer1 computer = new Computer1();
//接口类型指向实现类的对象
USB usb = new Mouse();
computer.runUSB(usb);
System.out.println("------------------------------");
Printer printer = new Printer();
computer.runUSB(printer);//USB usb = printer
computer.runBluetooth(printer);//Bluetooth bt = printer
}
}
输出结果
鼠标开始运行
---灯亮了---
---------
鼠标停止运行
---灯灭了---
------------------------------
-----打印机开始工作------
---------
-----打印机停止工作------
打印机蓝牙已连接
---------
打印机蓝牙已断开
接口和类的多态性的体现 :
接口的类型指向实现类的对象
USB usb = new Mouse();
注意 :①必须有实现关系 ②必须有重写方法的重写 ③接口的类型指向实现类的对象
2.判断类型
if(usb instanceof Mouse){
}
3.向下转型
Mouse m = (Mouse)usb;
JDK 1.8新特性
在JDK1.8之前接口中只能写常量和抽象方法, JDK 1.8开始接口中可以有 抽象方法,常量,静态方法,默认方法
说明:
1.如何调用接口中的静态方法:接口名.静态方法名
2.如何调用接口中的默认方法 :实现类的对象.默认方法名
3.类优先原则 :一个类继承的父类和实现的接口(默认方法)中有同名同参的方法,
那么调用的是父类中的。
4.接口冲突 : 一个类实现多个接口,多个接口(默认方法)中有同名同参的方法,
这时就会发生接口冲突。
5.解决接口冲突 : 实现类只需要去重写该方法即可。
再通过该类的对象调用此方法时调用的是重写的方法。
6.实现类重写接口中的默认方法后调用接口中的默认方法:接口名.super.默认方法名
interface MyInterface{
//静态方法
public static void info(){
System.out.println("MyInterface info");
}
//默认方法
default void show(){
System.out.println("MyInterface show");
}
}
interface MyInterface2{
//默认方法
default void show(){
System.out.println("MyInterface2 show");
}
}
//如果一个类既要继承父类又要实现接口 继承在前 实现接口在后
class MyClass implements MyInterface, MyInterface2{
@Override
public void show() {//接口冲突 重写默认方法
System.out.println("myclass show");
MyInterface.super.show();//调用接口中的默认方法 接口名.super.默认方法名
MyInterface2.super.show();
}
}
public class NewInterfaceTest {
public static void main(String[] args) {
MyInterface.info();//调用静态方法 接口名.静态方法名
new MyClass().show();//调用默认方法 实现类的对象.默认方法名
}
}
输出结果
MyInterface info
myclass show
MyInterface show
MyInterface2 show