接口的定义与使用
接口优先原则:在一个操作既可以使用抽象类又可以使用接口的时候,优先考虑使用接口
接口定义:接口就是一个抽象方法与全局常量的集合(纯粹版本的抽象类(JDK8前))
-
接口使用:interface + 类名
-
接口的命名规范:接口前加 I 来区分接口与类
interface IMyinterface {
public static final String MSG = "test";//全局常量
public abstract void test();//抽象方法
}
- 子类实现接口使用
implements
关键字,并且子类可以同时实现多个父接口(可以使用接口来实现多继承,父接口之间的相互转化)。一般使用接口名+Impl
来命名子类
interface IMyInterface {
public static final String MSG = "test";//全局常量
public abstract void test();//抽象方法
}
interface INews {
public abstract void fun();
}
class MyInterfaceImlp implements IMyInterface,INews {
public void test() {
System.out.println(MSG);
}
public void fun() {
System.out.println(MSG);
}
}
class Test {
public static void main(String[] args) {
IMyInterface myInterface = new MyInterfaceImlp();
myInterface.test();
INews news = new MyInterfaceImlp();
news.fun();
}
}
接口的使用限制
- 接口中只有public权限(不管是属性还是方法,其权限都是public)
- 接口中public、static、final、abstract都可以省略
- 阿里编码规约:接口中方法和属性不要加任何修饰符,public也不要加,保证代码简洁性
interface IMyinterface {
String MSG = "test";//全局常量
void test();//抽象方法
}
- 当一个子类既需要实现接口又需要继承抽象类时,请先使用
extends
继承一个抽象类,而后使用implements
实现多个接口
interface IMyInterface {
String MSG = "test";
void test();
}
interface INews {
void fun();
}
abstract class Person {
public abstract void print();
}
class MyInterfaceImlp extends Person implements IMyInterface,INews {
public void test() {
System.out.println(MSG);
}
public void fun() {
System.out.println(MSG);
}
public void print() {
System.out.println(MSG);
}
}
class Test {
public static void main(String[] args) {
IMyInterface myInterface = new MyInterfaceImlp();
myInterface.test();
INews news = new MyInterfaceImlp();
news.fun();
Person per = new MyInterfaceImlp();
per.print();
}
}
- 抽象类可以使用implements实现接口,但是接口不能extends抽象类
- 接口可以使用extends继承多个父接口
interface A {
void test1();
}
interface B {
void test2();
}
interface C extends A,B {
void test3();
}
class D implements C {
public void test1() {
System.out.println("接口1");
}
public void test2() {
System.out.println("接口2");
}
public void test3() {
System.out.println("接口3");
}
public void test4() {
System.out.println("接口4");
}
}
class Test {
public static void main(String[] args) {
D d = new D();
d.test1();
d.test2();
d.test3();
d.test4();
}
}
接口的应用
-
定义操作标准(USB2.0标准)
-
表示一种能力,进行一项操作
-
在分布式开发时暴露远程服务能力
现在要求描述一个概念-电脑上可以使用任何的usb设备(U盘,打印机等等):
//标准
interface USB {
void plugIn(); //插入
void setup(); //安装驱动
void work(); //正常使用
}
class Mouse implements USB {
public void plugIn() {
System.out.println("鼠标插入电脑");
}
public void setup() {
System.out.println("安装鼠标驱动");
}
public void work() {
System.out.println("鼠标正常使用");
}
}
class Keyboard implements USB {
public void plugIn() {
System.out.println("键盘插入电脑");
}
public void setup() {
System.out.println("安装键盘驱动");
}
public void work() {
System.out.println("键盘正常使用");
}
}
class Computer {
public void test(USB usb) {
usb.plugIn();
usb.setup();
usb.work();
}
}
class Test {
public static void main(String[] args) {
Computer computer = new Computer();
computer.test(new Mouse());
computer.test(new Keyboard());
}
}
抽象类与接口的区别
除了单继承的局限之外,实际上使用抽象类和接口都是类似的。在实际开发中,抽象类的设计比接口复杂。
- 接口是Java的核心,慢慢会学到接口更多的使用与设计。
- 开发之中优先考虑接口,以避免单继承局限。
- 抽象类是模板,有层次感;接口则更关心行为与混合。开发之中优先考虑接口,以避免单继承局限。