接口
基本介绍 :接口就是给出一些没有实现的方法,封装到一起,到某个类要使用的时候,再根据具体的情况把这些方法写出来,在接口中的抽象方法可以省略abstract关键字。
语法:
interface 接口名{
//属性
//方法
}
class 类名 implements 接口名{
//自己的属性
//自己的方法
//必须实现的接口的抽象方法
}
代码
public interface UsbInterface { //接口
//规定接口的相关方法
public void start();
public void stop();
}
public class Camera implements UsbInterface{//实现接口,就是把接口方法实现
@Override public void start() {
System.out.println("相机开始工作...");
}
@Override public void stop() {
System.out.println("相机停止工作....");
}
}
//Phone 类实现 UsbInterface
//即 Phone 类需要实现 UsbInterface 接口规定/声明的方法
public class Phone implements UsbInterface {
@Override public void start() {
System.out.println("手机开始工作...");
}
@Override public void stop() {
System.out.println("手机停止工作.....");
}
}
public class Computer{
public void work(UsbInterface usbInterface){
usbInterface.satrt();
usbInterface.stop();
}
}
public class Interface01 {
public static void main(String[] args) {
//创建手机,相机对象
//Camera 实现了 UsbInterface
Camera camera = new Camera();
//Phone 实现了 UsbInterface
Phone phone = new Phone();
//创建计算机
Computer computer = new Computer();
computer.work(phone);
//把手机接入到计算机
System.out.println("===============");
//把相机接入到计算机//把相机接入到计算机
computer.work(camera);
}
}
public interface DBInterface { //项目经理
public void connect();//连接方法
public void close();//关闭连接
}
//mysql操作
public class MysqlDB implements DBInterface {
@Override public void connect() {
System.out.println("连接 mysql");
}
@Override public void close() {
System.out.println("关闭 mysql");
}
}
//oracle操作
public class OracleDB implements DBInterface{
@Override public void connect() {
System.out.println("连接 oracle");
}
@Override public void close() {
System.out.println("关闭 oracle");
}
}
public class Interface03 {
public static void main(String[] args) {
MysqlDB mysqlDB = new MysqlDB();
test(mysqlDB);
OracleDB oracleDB = new OracleDB();
test(oracleDB);
}
public static void test(DBInterface db) {
db.connect();
db.close();
}
}
jdk7.0前,接口里的所有方法都没有方法体
public void function();
jdk8.0后接口类可以有静态方法(加上static),默认方法,(需要在前面default),也就是说接口中可以有方法的具体实现
default public void function(){}
public static void function(){}
接口细节
- 接口不能被实例化
- 接口中的所有方法都是public方法,接口中的抽象方法,可以不用abstract修饰
- 一个普通类实现接口,就必须将该接口的所有方法都实现,(快捷键 alt+enter)
- 抽象类去实现接口时,可以不用实现接口的方法
- 一个类同时可以实现多个接口
- 接口中的属性,只能是final的,而且是public static final 修饰符 比如:int n=1;实际上是public static final int n=1;(必须初始化)
- 接口中属性的访问形式:接口名.属性名
- 接口不能继承其他的类,但是可以继承多个别的接口
interface A extends B,C{}
- 接口的修饰符只能是public和默认,这点和类的修饰符是一样的
实现接口 VS 继承类
- 接口和继承解决的问题不同
继承的价值主要在于:解决代码的复用性和可维护性。
接口的价值主要在于:设计,设计好各种规范(方法),让其它类去实现这些方法。即更加的灵活.. - 接口比继承更加灵活
接口比继承更加灵活,继承是满足is - a的关系,而接口只需满足like - a的关系。 - 接口在一定程度上实现代码解耦[即:接口规范性+动态绑定机制]
接口的多态特性
接口可以接收实现该接口的类的对象
-
多态参数(前面案例体现)
在前面的Usb接口案例,UsbInterface usb,既可以接收手机对象,又可以接收相机对象,就体现了接口多态(接口引用可以指向实现了接口的类的对象) -
多态数组
案例:给Usb数组中,存放Phone和相机对象,Phone类还有一个特有的方法call() ,请遍历Usb数组,如果是Phone对象,除了调用Usb接口定义的方法外,还需要调用Phone特有方法call。Usb usbs[] = new Usb[2]; usbs[0] = new Phone(); usbs[1] = new Camera(); for (inti= 0; i < usbs.length; i++) { usbs[i].start(); usbs[i].stop(); if (usbs[i] instanceof Phone) { ((Phone)usbs[i].call();//向下转型 } }