Java基础|Java8接口新特性

2023年5月26日08:08:35

1 接口特性

  1. 接口不是类,不能使用 new 实例化一个接口;
  2. 不能构造接口的对象,但可声明接口的变量;
  3. 接口变量必须引用实现了接口的类对象;
  4. 可以使用 instanceof 检查一个对象是否实现了某个特定的接口;
  5. 可以建立类的继承关系一样,接口可以继承接口进行扩展;
  6. 接口中不能包含实例域或静态方法,但可包含常量;
  7. 接口中声明的方法自动地设置为 public;
  8. 接口中的域(即常量)自动地设置为 public static final;

2 Java8接口-新特性

  1. 静态方法。
    JavaSE8 允许在接口中增加静态方法
  2. 默认方法。
    可以为接口方法提供一个默认实现,必须使用 default 修饰符标记这个方法;
  3. 解决默认方法冲突问题:
    如果接口中将一个方法定义为默认方法,然后在超类或另一个接口中定义了同样的方法。就要解决冲突,规则如下:
    ① 超类优先。如果超类提供了一个具体方法,同名且有相同参数类型的默认方法会被忽略。
    ②接口冲突。如果一个超接口提供了一个默认方法,另一个接口提供了一个同名而且参数类型相同的方法,必须覆盖这个方法来解决冲突。
    ③类优先原则。如果一个类扩展了一个超类,同时实现了一个接口,并且从超类和接口继承了相同的方法。此种情况使用类优先原则,接口的默认方法会被忽略。

3 具体用例

接口PersonInfo

/**
 * @version $Id: PersonInfo.java, v 0.1 2017年6月9日 下午5:19:14
 */
public interface PersonInfo {
    //方法都自动设置为public
    void printAge();

    //常量自动设置为 public static final
    String DEFAULT_NAME = "TIANCI";

    int    DEFAULT_AGE  = 18;

    String DEFAULT_SEX  = "男";

    //javaSE8可以有静态方法
    static void printSex() {
        System.out.println(DEFAULT_SEX);
    };

    //javaSE8 可以为接口方法提供默认实现,default进行标记
    default void printName() {
        System.out.println(DEFAULT_NAME);
    };
}

接口PersonHobby

/**
 * @version $Id: PersonHobby.java, v 0.1 2017年6月9日 下午5:41:59
 */
public interface PersonHobby {
    String DEFAULT_HOBBY = "运动";

    default void printName() {
        System.out.println("hobby name is:" + DEFAULT_HOBBY);
    }
}


类Person

/**
 * Person类实现了两个接口,两个接口中都有默认的实现方法printName()
 * 造成冲突,解决冲突的办法就是在类中覆盖这个方法
 * 方法具体实现可以是重写,也可以选择调用具体接口的默认实现方法
 * @version $Id: Person.java, v 0.1 2017年6月9日 下午5:19:00
 */
public class Person implements PersonInfo, PersonHobby {

    private String age;
    private String name;

    {
        age = "age init from Person.";
        name = "name init form Person.";
    }

    @Override
    public void printAge() {
        System.out.println(age);
    }

    //两个接口都有该方法默认实现,进行覆写来解决冲突
    //方法具体实现可以是重写,也可以选择调用具体接口的默认实现方法
    public void printName() {
        /*调用具体的接口默认实现
        PersonInfo.super.printName();*/
        /* 调用具体的接口默认实现
        PersonHobby.super.printName();*/
        System.out.println(name);
    }
}

测试代码

/**
 * @version $Id: Test.java, v 0.1 2017年6月9日 下午5:45:44
 */
public class Test {
    public static void main(String[] args) {
        Person person1 = new Person();
        //可以使用接口声明变量,变量必须引用实现了接口的类对象
        //但对象的能力只拥有声明的接口类型中的能力
        //如person3和person4没有printAge()的能力
        PersonInfo person2 = new Person();
        PersonHobby person3 = new Person();
        PersonHobby person4 = person1;

        person1.printName();
        person1.printAge();
        System.out.println("-------");
        person2.printName();
        person2.printAge();
        System.out.println("-------");
        person3.printName();
        person4.printName();
        /*    
         * 对象的能力只拥有声明的接口类型中的能力
         * person3和person4没有printAge()能力,下面方法不可用
         * person3.printAge();
         * person4.printAge();
        */
        //使用接口调用接口中声明的静态方法
        System.out.println("----接口中静态方法---");
        PersonInfo.printSex();
        System.out.println("----访问接口中常量---");
        System.out.println(PersonInfo.DEFAULT_AGE);
        System.out.println(PersonInfo.DEFAULT_NAME);
        System.out.println(PersonInfo.DEFAULT_SEX);
        System.out.println(PersonHobby.DEFAULT_HOBBY);
    }
}

测试结果:

name init form Person.
age init from Person.
-------
name init form Person.
age init from Person.
-------
name init form Person.
name init form Person.
----接口中静态方法-------访问接口中常量---
18
TIANCI
男
运动

  • 作者:不甩锅的码农
  • 原文链接:https://blog.csdn.net/BiLaHePan/article/details/72965425
    更新时间:2023年5月26日08:08:35 ,共 2713 字。