一:基本介绍
接口就是给出一些没有实现的方法,封装到一起,到某个类要使用的时候,在根据具体情况把这些方法写出来。语法:
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数据库连接成功");
}
@Override
public void close() {
System.out.println("Oecle数据库连接结束");
}
}
public class Mysql implements InterfaceTest{
@Override
public void connection() {
System.out.println("Mysql数据库连接成功");
}
@Override
public void close() {
System.out.println("Mysql数据库连接关闭");
}
}
三:注意事项和细节
接口不能被实例化,只能被实现 ```java public interface InterfaceTest { public void connection();
public void close();
} public class connect implements InterfaceTest{
}
- 接口中所有的方法是public 方法,口中抽象方法,可以不用abstract修饰
```java
public 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数据库连接成功”); }
@Override
public void close() {
System.out.println("Mysql数据库连接关闭");
}
}
- 抽象类实现接口,可以不用实现接口的方法
```java
abstract public class Test01 implements InterfaceTest {
//抽象了可以不用全部实现接口
@Override
public 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;(必须初始化)
- 接口中属性的访问形式:接口名.属性名
```java
public 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 和默认 ,这点和类的修饰符是一样的
```java
public 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:多态接口数组
```java
public 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;
}
@Override
public 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;
}
@Override
public 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{
@Override
public 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;//ok
System.out.println(b.a); //23
System.out.println(A.a); //23
System.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);
//访问父类的属性就用super
System.out.println(super.x);
}
}
public static void main(String[] args) {
new C().pX();
}
:::danger
访问接口的属性用:接口名.属性
访问父类的属性用:super(属性名)
:::