接口
概念
在软件工程中,软件与软件的交互很重要,这就需要一个约定。每个程序员都应该能够编写实现这样的约定。接口就是对约定的描述。
在Java编程语言中,接口是类似于类的引用类型,它只能包含常量,方法签名,默认方法,静态方法和嵌套类型。方法主体仅适用于默认方法和静态方法。接口无法实例化它们只能由类实现或由其他接口扩展。
接口声明可以包含方法签名,默认方法,静态方法和常量定义。具有实现的方法是默认方法和静态方法。
从上面的描述中可以得出: 接口中没有构造方法。
你可以简单的把接口视作是一个抽象类, 但却很有区别
接口定义
// [] 代表可选
[public] interface 接口名 {
[public static final]数据类型 变量名 = 变量的值; //接口中定义变量,该变量是静态常量,在定义的时候必须赋值
[public abstract] 返回值类型 方法名([参数列表]);//定义接口方法
/***************************************************************************************************************************
在Java 8中,接口中引入了default方法。
default方法是指可以在接口中定义实现了方法体的方法,而不需要实现该接口的所有类都去重新实现这个方法。
在接口中,default方法使用default关键字进行修饰
需要注意的是,default方法必须提供一个方法体,而且不能是abstract或final等修饰符的组合。
接口中的default方法提供了一种在不破坏原有代码结构的情况下向接口添加新功能的方式。
当我们需要给一个接口添加新的方法时,如果直接向接口中添加新的抽象方法,那么所有已经实现该接口的类都必须重新实现这个新方法,这会导致对原有代码的大量修改。
而通过为接口添加default方法,我们可以使得接口中原有的实现不受影响,并且可以让实现该接口的类选择性地覆盖或继承这个新方法。
*/
default 返回值类型 方法名([参数列表]) { // 接口中定义的默认方法,必须在JDK8及以上版本使用
[return 返回值;]
}
/***************************************************************************************************************************
static方法是属于接口本身的,而不是属于实现该接口的类。
在接口中定义的static方法可以直接通过接口名来调用,无需通过实现类的实例来调用。
这使得我们可以在接口中提供一些通用的静态方法,用于处理特定类型的数据或执行特定的操作。
需要注意的是,static方法只能在接口中定义,不能在接口的实现类中覆盖或继承。
因为static方法与接口相关,而不是与实现类相关。
另外,由于static方法无法访问实例成员,所以它只能访问接口中的静态成员或其他静态方法。
*/
static 返回值类型 方法名([参数列表]) { // 接口中定义的静态方法,必须在JDK8及以上版本使用
[return 返回值;]
}
private 返回值类型 方法名([参数列表]) { // 接口中定义的私有方法,必须在JDK9及以上版本使用
[return 返回值;]
}
}
接口中默认的访问修饰符是public
, 接口中声明的变量只能是静态常量
使用接口(只能通过类实现)
public interface Text {
default void show() { // 默认方法, 实现类不需要实现它
System.out.print("暂时");
}
void sss();
}
class TextClass implements Text {
@Override /*子类必需实现接口声明的所有接口方法*/
public void sss() {
}
}
public interface Text {
default void show() {
System.out.print("暂时");
}
void sss();
}
public interface Text2 {
void s2s2s();
}
// 接口可以多继承
interface Txt extends Text, Text2 {
void playTxt();
}
class TxtClass implements Txt {
/* === 子类必需实现接口声明的所有接口方法 === */
@Override
public void sss() {
}
@Override
public void playTxt() {
}
@Override
public void s2s2s() {
}
}
使用
public class text_2 {
public static void main(String[] args) {
TextClass textClass = new TextClass(); // 使用具体的类
textClass.show();
textClass.sss();
}
}
!!!接口是Java中唯一可以多继承的!!!
类继承类并且实现接口
语法
访问修饰符 [abstract] class 类名 extends 父类 implements 接口1[, 接口2, ..., 接口n] {
// 对接口的所有接口方法进行实现
}
接口与抽象类的区别
- 抽象类拥有构造方法,而接口没有构造方法
- 抽象类可以定义成员变量、静态变量、静态常量,而接口中只能定义公开的静态常量
- 抽象类中的方法可以有受保护、默认的方法,而接口中的方法都是公开的( JDK9 中可以定义的私有方法除外)
- 抽象类主要应用在对于抽象事物的描述,而接口主要应用在对于约定、规则的描述
- 抽象类只能够单继承,而接口可以多继承
- 抽象类可以继承一个类并且实现一个接口, 而接口只能被实现