Java | 接口

接口的概念

接口,主要是用来描述类需要具有什么样的功能(方法),而不给出每个功能具体实现,把这些功能的实现交给实现该接口的类去实现,实现该接口的类必须实现该接口的所有方法(接口的静态方法跟默认方法除外)。
接口有以下几个特点:

  1. 接口中方法都默认且必须用 public 修饰的,因为是默认的所以可以省略不写。
  2. 接口中的域(属性)也是默认且必须用 public static final 修饰
  3. 接口跟抽象类一样不能实例化,可以声明变量
  4. 接口中不能有实例域也就是成员变量(ps:如果有违反了第二条, 接口不能被实例化有实例域也没啥意义)
  5. 实现接口时,必须将实现方法声明为 public
  6. 在 jdk 1.8 前接口不能有实现方法,之后就可以有了,可以用 staticdefault 声明实现方法。
  7. 可以用 instanceof 检查对象是属于某个一样的,去检查对象是否实现了某个接口。

interface 声明一个接口:

package com.project;

public interface Person {
    // 吃东西
    void eat();
}

implements 实现一个接口

package com.project;

public class Woman implements Person{

    @Override
    public void eat() {
        System.out.println("正在吃苹果");
    }

}

接口中的静态方法

接口中的静态方法必须写具体实现,且不被实现该接口的类继承,可以通过 接口名.方法名调用 类似于类的静态方法。

static 声明一个静态方法

package com.project;

public interface Person {
    // 吃东西
    public static void eat() {
        System.out.println("正在吃苹果");
    }
}

不需要也不能实现接口的静态方法

package com.project;

public class Woman implements Person{
    
    public static void main(String[] args) {
        // 调用接口静态方法
        Person.eat();
    }
}

接口中的默认方法

默认方法提供了接口方法的默认实现,如果实现接口的类没有重写默认方法,那么采用默认实现。
跟静态方法不同的是,实现类会继承接口的默认方法,可以选择实现或者不实现。

package com.project;

public interface Person {
    // 吃东西
    public default void eat() {
        System.out.println("人正在吃苹果");
    }
}

默认方法冲突

如果两个接口方法名相同,有类实现类这两个接口的话,实现类必须覆盖。
如果接口跟父类方法名冲突,父类优先,接口方法会被忽略。

你可能感兴趣的:(Java | 接口)