汗,你还在被老教程中java接口的特征误导吗?

接口中可以运行main方法吗?

可不可以运行我不知道,那么直接runing上结果:

在这里插入图片描述

看图,编译不仅没有报错,控制台还正确打印出了我们的结果?

Why ?

回顾旧教程中java接口的定义

Java接口是一种规范,里面定义了一系列的抽象方法,这些方法没有具体的实现。接口没有构造方法,无法被实例化,它的主要用途就是被实现类实现 。当一个类实现了一个接口,它必须实现接口中所有的方法,否则这个类必须声明为抽象类。

Java接口的特点包括:

  • 接口里边的成员变量都是常量,默认被public static final修饰,不写也会默认加上。
  • 接口里面的方法都是抽象方法,默认被public abstract修饰,不写也会默认加上。

上面的概念应该是我们曾今初学java时常常背诵记忆的。“接口里面的方法都是抽象方法”,“当一个类实现了一个接口,它必须实现接口中所有的方法” ,这些观点在Java8之前确实适用,但在当下已经不正确了。

Java8开始,允许接口具有默认方法和静态方法。引入这些新特征,是为了便于我们在接口中添加新的方法,而不影响现有实现这些接口的类。举个例子,有100多个类实现了一个接口A,那么我如果在接口A中添加了一个方法,我们就必须同时在已有的100个实现类中去实现这个方法,这对我们来说是难以想象的。这就是为什么在Java8中,接口中需要引入默认方法和静态方法。这些方法添加到任何接口中,都不需要改动现有的实现类,这使得我们在不破坏代码的情况下给接口添加了新的功能。

Java9开始,允许接口具有私有方法。因为私有方法仅可以在接口内部访问,不能被继承也不能被重写。引入这个特征,就为了实现前面引入的默认和静态方法的代码可重用性问题,于是就对这段共用代码进行封装,以便对外隐藏,只有该接口中的默认和静态方法才可以访问。

接口中的默认方法

接口中的默认方法,仅用关键字default修饰即可,其访问范围是public的,这种方法必须有具体实现(即含有方法体),可以继承给子类,且可以被子类重写覆盖。其目的就是可以在不破坏现有实现类的情况下,向现有接口添加新的方法,以便支持接口的演化,使得接口可以向后兼容。

在这里插入图片描述

接口中的静态方法

接口中的静态方法,仅用关键字static修饰即可,访问范围也是public的,方法必须具有实现,且方法归接口所有,不能被子类继承或重写。所以这种方法只能通过接口名调用,而不能通过子类调用。

在这里插入图片描述

接口中的私有方法

接口中的私有方法,仅在Java9之后支持。如果是接口中默认方法访问,用关键字private修饰即可,如果是静态方法访问用关键字private static修饰即可。除此之外,其他任何地方都不可访问。代码如下:

public interface Ai {
    
    
    private void a(){
    
    
        System.out.println("调用普通私有方法a()");
    }
    private static void b(){
    
    
        System.out.println("调用静态私有方法b()");
    }

    default void aa(){
    
    
        this.a();
    }
    static void bb(){
    
    
        Ai.b();
    }

    public static void main(String[] args) {
    
    
        //创建实例调用默认方法aa
        new Ai(){
    
    }.aa();
        //通过接口名调用静态方法bb
        Ai.bb();
    }
}

运行结果:

在这里插入图片描述


在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_36756227/article/details/130163818
今日推荐