> 文章列表 > JavaSE基础(26) 接口

JavaSE基础(26) 接口

JavaSE基础(26) 接口

概述

接口,是Java语言中一种引用类型,是方法的集合,如果说类的内部封装了成员变量、构造方法和成员方法,那么接口的内部主要就是封装了方法,包含抽象方法(JDK 7及以前),默认方法和静态方法(JDK 8),私有方法(JDK 9)。

接口的定义,它与定义类方式相似,但是使用 interface 关键字。它也会被编译成.class文件,但一定要明确它并不是类,而是另外一种引用数据类型。

        引用数据类型:数组,类,接口。

接口就是一种约定,契约。一种规范。

例如生活中的USB接口,鼠标:键盘,U盘等等只要遵循了USB接口规范,那么就可以正常使用;

接口定义

含有抽象方法

抽象方法:使用 abstract 关键字修饰,可以省略,没有方法体。该方法供子类实现使用。

代码如下:

public interface InterFaceName {public abstract void method();
}

含有默认方法和静态方法

public interface InterFaceName {public default void method() {// 执行语句}public static void method2() {// 执行语句 }
}

含有私有方法和私有静态方法

私有方法:使用 private 修饰,供接口中的默认方法或者静态方法调用。

代码如下:

public interface InterFaceName {private void method() {// 执行语句}
}

示例:

public interface Test {public static final double PI=3.14;//定义的变量会默认加上public static finalpublic abstract void test1();void test2();//默认加上public abstractdefault void test3(){//显示声明一个defaultSystem.out.println("wowowd");}
}

接口实现

接口要有实现类来实现接口中的抽象方法。

子类和抽象父类的关系:extends

实现类和接口的关系:implements

类与接口的关系为实现关系,即类实现接口,该类可以称为接口的实现类,也可以称为接口的子类。

非抽象子类实现接口:

1. 必须重写接口中所有抽象方法。

2. 继承了接口的默认方法,即可以直接调用,也可以重写。

实现格式:

class 类名 implements 接口名 {// 重写接口中抽象方法【必须】// 重写接口中默认方法【可选】 
}

注意:

        接口中抽象方法必须全部实现

        接口中默认方法可以继承,可以重写,二选一,但是只能通过实现类的对象来调用。

        接口中静态方法只能使用接口名调用,不可以通过实现类的类名或者实现类的对象调用

示例:

//接口
public interface Usb {public void start();//开始工作public void end();//结束工作
}public class Mouse implements USB {@Overridepublic void start() {System.out.println("鼠标开始工作。。。");}@Overridepublic void end() {System.out.println("鼠标结束工作。。。。");}
}public class Keyboard implements USB {@Overridepublic void start() {System.out.println("键盘开始工作。。。。。");}@Overridepublic void end() {System.out.println("键盘关闭。。。");}
}

测试:

USB usb = new Mouse();
usb.start();
usb.end();

一个类可以实现多个接口

接口最重要的体现:解决单继承的弊端。将多继承这种机制在Java中通过多实现完成了

public interface Fu1{void show1();
}public interface Fu2{void show2();
}public class Zi implements Fu1,Fu2{// 多实现,同时实现多个接口@Overridepublic void show1();@Overridepublic void show2();
}

怎么解决多继承的弊端?

弊端:多继承时,当多个父类中有相同的功能时,子类调用会产生不确定性。其实核心原因就是在于多继承父类中功能有主体,而导致调用运行时,不确定运行哪个主体内容。

为什么多实现能解决呢?

因为接口中的功能都没有方法体,由子类来明确

一个类继承类同时可以实现接口

接口和类之间可以通过实现产生关系,同时也学习了类与类之间可以通过继承产生关系。当一个类已经继承了一个父类,它又需要扩展额外的功能,这时接口就派上用场了

子类通过继承父类扩展功能,通过继承扩展的功能都是子类应该具备的基础功能。如果子类想要继续扩展其他类中的功能呢?这时通过实现接口来完成

public class Fu{public void show(){}
}
public interface Inter{public abstract void show1();
}
public class Zi extends Fu implements Inter{public void show1();
}

接口的出现避免了单继承的局限性。父类中定义的事物的基本功能。接口中定义的事物的扩展功能

接口的多继承

学习类的时候,知道类与类之间可以通过继承产生关系,接口和类之间可以通过实现产生关系,那么接口与接口之间会有什么关系

多个接口之间可以使用 extends 进行继承

示例1:

public interface Fu1{void show1();
}public interface Fu2{void show2();
}public interface Fu3{void show3();
}public interface Zi extends Fu1,Fu2,Fu3{void show();
}

示例2:

public interface IFinger {void finger();//指纹识别
}public interface IFace {void face();//人脸识别
}public interface IDoor extends IFace,IFinger{//开门public void open();//关门public void close();
}

在开发中如果多个接口中存在相同方法,这时若有个类实现了这些接口,那么就要实现接口中的方法,由于接口中的方法是抽象方法,子类实现后也不会发生调用的不确定性

接口和抽象类的区别

相同点:

        都存在抽象方法;

        不能创建对象,不能实例化。

        可以作为引用类型。

        具备Object类中所定义的方法。

不同点:

        所有属性都是公开静态常量,隐式使用public static final修饰。

        所有方法都是公开抽象方法,隐式使用public abstract修饰。

        没有构造方法、动态代码块、静态代码块。

接口的好处

        接口的出现降低了耦合性

        设计与实现完全分离,更容易更换具体实现。

        更容易搭建程序框架。