一:基本介绍
接口就是给出一些没有实现的方法,封装到一起,到某个类要使用的时候,在根据具体情况把这些方法写出来。语法:
interface 接口名{//属性//抽象方法}
:::danger
接口是更加抽象的抽象的类,抽象类里的方法可以有方法体。
接口里的所有方法都没有方法体。【JDK7.0】__接口体现了程序设计的多态和高内聚低耦合的设计思想
特别说明:JDK8。0后接口类可以有静静态方法,默认方法,也就是接口可以有方法的具体实现
:::
二:深入理解
- 说现在要制造战斗机,武装直升机.专家只需把飞机需要的功能/规格定下来即可,然后让别的人具体实现就可。
- 说现在有一个项目经理(段玉),管理三个程序员,功能开发一个软件.为了控制和管理软件,项目经理可以定义一些接口,然后由程序员具体实现。(1.项目质量2.项目进度3.项目奖)参加工作
模拟一个数据库连接操作
public interface InterfaceTest {//数据库链接操作public void connection();public void close();}public class Test {public static void main(String[] args) {Mysql mysql = new Mysql();Orcle orcle = new Orcle();//通过传入的参数来判断执行的数据库连接操作to(mysql);to(orcle);}public static void to(InterfaceTest interfaceTest){interfaceTest.connection();interfaceTest.close();}}public class Orcle implements InterfaceTest{@Override//继承接口来实现接口的方法,来完成对应的操作public void connection() {System.out.println("Orcle数据库连接成功");}@Overridepublic void close() {System.out.println("Oecle数据库连接结束");}}public class Mysql implements InterfaceTest{@Overridepublic void connection() {System.out.println("Mysql数据库连接成功");}@Overridepublic void close() {System.out.println("Mysql数据库连接关闭");}}
三:注意事项和细节
接口不能被实例化,只能被实现 ```java public interface InterfaceTest { public void connection();
public void close();
} public class connect implements InterfaceTest{
}
- 接口中所有的方法是public 方法,口中抽象方法,可以不用abstract修饰```javapublic interface InterfaceTest {public void close();//实际上是abtract void close();}
一个普通类实现接口,就必须将该接口的所有方法实现 ```java public interface InterfaceTest { public void connection();
public void close();
} public class Mysql implements InterfaceTest{ //必须实现所有接口的方法 @Override public void connection() { System.out.println(“Mysql数据库连接成功”); }
@Overridepublic void close() {System.out.println("Mysql数据库连接关闭");}
}
- 抽象类实现接口,可以不用实现接口的方法```javaabstract public class Test01 implements InterfaceTest {//抽象了可以不用全部实现接口@Overridepublic void close() {}}public interface InterfaceTest {public void connection();public void close();}
一个类可以同时实现多个接口【单继承,多接口】 ```java public class InteranceTest00 implements InterfaceTest,TestInterface{
@Override public void connection() {
}
@Override public void close() {
} }
- 接口中的属性,只能是final的,而且是 public static final修饰符。比如:int a=1;实际上是public static final int a=1;(必须初始化)- 接口中属性的访问形式:接口名.属性名```javapublic class Test {public static void main(String[] args) {System.out.println(AA.NUM); //可以通过接口接口名调用AA.NUM = 20; //且不能修改,也这也说明是final的}}interface AA{int NUM =1;}
- 接口不能继承其他的类,但是可以继承多个别的接口 ```java //接口可以继承接口 interface AA{ int NUM =1;
} interface BB extends AA{
}
- 接口的修饰符只能是public 和默认 ,这点和类的修饰符是一样的```javapublic interface AA{int NUM =1;}interface BB extends AA{}
四:实现接口vs接口类
- 接口和继承解决的问题不同
- 继承的价值主要在于:解决点的复用性和可维护性
- 接口的价值主要在于:设计,设计好各种规范,让其他类去实现这些方法,即更加的灵活。。
- 接口比继承更加的灵活
- 继承满足is-a的关系
- 接口满足like-a 的关系
接口在一定程度上实现代码解耦[即:接口规范性+动态绑定机制] ```java public class Test { public static void main(String[] args) {
LitterMoney litterMoney = new LitterMoney();litterMoney.fly();litterMoney.walk();
} } interface Fly{ public void fly(); } class Monkey{ private String name;
public void walk(){
System.out.println("猴子走路");
} }
class LitterMoney extends Monkey implements Fly{ @Override public void walk() { super.walk(); } @Override public void fly() { System.out.println(“猴子通过接口学会飞了”); } }
<a name="shKDR"></a>### 五:接口的多态属性**_接口引用可以指向实现了接口的类的对象_**<a name="aXMP9"></a>#### 1:多态接口数组```javapublic class Test00 {public static void main(String[] args) {USB[] usb = new USB[2];//接口类型的变量可以指向实现了该接口的类的对象实例usb[0] = new Camera("索尼单反");usb[1] = new Phone("华为");for (int i = 0; i < usb.length; i++) {if (usb[i] instanceof Phone){usb[i].Use();((Phone)usb[i]).work();}}}}public interface USB {void Use();}public class Phone implements USB{private String name;public void work(){System.out.println("手机工作中");}public Phone(String name) {this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic void Use() {System.out.println("用" +getName()+"打电话");}}public class Camera implements USB{private String name;public Camera(String name) {this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic void Use() {System.out.println("用"+getName()+"照相");}}
2:多态传递现象
public class Test01 {public static void main(String[] args) {//接口类型的变量可以指向,实现了该接口的类的对象实例BB bb =new Person();//如果BB继承了AA接口//那么就相当于Person类也实现了AA接口//这就是接口的多态传递AA aa = new Person();}}interface AA{void wolk();}interface BB extends AA{}class Person implements BB{@Overridepublic void wolk() {}}
六:练习
1:
interface A{int a=23;//等价public static final int a = 23;}class B implements A{ //正确}public static void main(String[] args) {B b=new BO;//okSystem.out.println(b.a); //23System.out.println(A.a); //23System.out.println(B.a); //23}
2:

interface A {int x = 0; //想到 等价 public static final int x = 0;}class B {int x = 1;}//普通属性class C extends B implements A {public void pX() {//System.out.println(x); //错误,会报错,因为有两个x不知道调用的是哪一个//访问接口的x就用接口名.属性System.out.println(A.x);//访问父类的属性就用superSystem.out.println(super.x);}}public static void main(String[] args) {new C().pX();}
:::danger
访问接口的属性用:接口名.属性
访问父类的属性用:super(属性名)
:::
