接口 interface
java提供了一个关键词interface 用这个关键词来定义接口这种特殊结构
public interface 接口名(){
//成员变量(常量)
//public static final String NAME="张三"
//public static final 不加 java自动帮你加上
String NAME="张三";
//成员方法(抽象方法)
//public abstract 不加 java 自动帮你加上
void test1();
}
接口的常量可以通过接口名.常量名
接口的好处
弥补了类单继承的不足,一个类同时可以实现多个接口。
让程序可以面向接口编程,这样程序员可以灵活方便的切换各种业务实现。
接口使用场景
对象有什么?
比如:
我有车
我有房
我有钱
....
JDK8接口的新特性
随着JDK版本的升级,在JDK8版本以后接口中能够定义的成员也做了一些更新,从JDK8开始,接口中新增的三种方法形式。
我们看一下这三种方法分别有什么特点?
默认方法:必须使用default修饰,默认会被public修饰 实例方法:对象的方法,必须使用实现类的对象来访问。私有方法:必须使用private修饰。(JDK 9开始才支持的) 实例方法:对象的方法。
静态方法:必须使用static修饰,默认会被public修饰
public interface A {
/**
* 1、默认方法:必须使用default修饰,默认会被public修饰
* 实例方法:对象的方法,必须使用实现类的对象来访问。
*/
default void test1(){
System.out.println("===默认方法==");
test2();
}
/**
* 2、私有方法:必须使用private修饰。(JDK 9开始才支持的)
* 实例方法:对象的方法。
*/
private void test2(){
System.out.println("===私有方法==");
}
/**
* 3、静态方法:必须使用static修饰,默认会被public修饰
*/
static void test3(){
System.out.println("==静态方法==");
}
void test4();
void test5();
default void test6(){
}
}
接下来我们写一个B类,实现A接口。B类作为A接口的实现类,只需要重写抽象方法就可以了,对于默认方法不需要子类重写。
代码如下:
public class B implements A{
@Override
public void test4() {
}
@Override
public void test5() {
}
}
最后,写一个测试类,观察接口中的三种方法,是如何调用的
public class Test {
public static void main(String[] args) {
// 目标:掌握接口新增的三种方法形式
B b = new B();
b.test1(); //默认方法使用对象调用
// b.test2(); //A接口中的私有方法,B类调用不了
A.test3(); //静态方法,使用接口名调用
}
}
综上所述:JDK8对接口新增的特性,有利于对程序进行扩展。
接口的其他细节
一个接口可以继承多个接口
public class Test {
public static void main(String[] args) {
// 目标:理解接口的多继承。
}
}
interface A{
void test1();
}
interface B{
void test2();
}
interface C{}
//比如:D接口继承C、B、A
interface D extends C, B, A{
}
//E类在实现D接口时,必须重写D接口、以及其父类中的所有抽象方法。
class E implements D{
@Override
public void test1() {
}
@Override
public void test2() {
}
}
接口除了上面的多继承特点之外,在多实现、继承和实现并存时,有可能出现方法名冲突的问题,需要了解怎么解决(仅仅只是了解一下,实际上工作中几乎不会出现这种情况)
1.一个接口继承多个接口,如果多个接口中存在方法声明冲突,则此时不支持多继承
2.一个类实现多个接口,如果多个接口中存在方法声明冲突,则此时不支持多实现
3.一个类继承了父类,又同时实现了接口,父类中和接口中有同名的默认方法,实现类会有限使用父类的方法
4.一个类实现类多个接口,多个接口中有同名的默认方法,则这个类必须重写该方法。
综上所述:一个接口可以继承多个接口,接口同时也可以被类实现。