从kafka源码阅读中看出了问题之abstract interface

今天在看到kafka的源码类org.apache.kafka.common.network.SslTransportLayer时,看到这个类引用了

javax.net.ssl.SSLSession这个类,点进去看了一下这个类,着实让我吃惊了一把。

public abstract interface javax.net.ssl.SSLSession

见惯了abstract class,还真没见过abstract interface。什么时候,abstract都开始跨界修饰起了interface了。

本着好奇的心,我写了这样一个接口,同样的用abstract修饰了一番。只是接口里面什么都没有。

public abstract interface AbstractInterface {

}

然后在JDK1.8.0_151的环境下,编译然后反编译,看了看结果。

原来对于一个空接口而言,加了abstract和没加没什么区别。

如果接口里面有方法呢?既然abstract修饰,那就来一个abstract方法吧。

public abstract interface AbstractInterface {
    abstract void func();
}

编译反编译一下,看看结果:

可以看到,javac编译器还是去掉了interface前面的abstract。但是方法前面的abstract还是保留下来了。

那么如果,func()方法前面不加abstract修饰呢?

public abstract interface AbstractInterface {
    void func();
}

编译反编译,看看结果:

 javac还是在方法前面还是给加上了abstract。也同样去掉了interface前面的abstract。

最后一个问题,如果没有abstract修饰interface,可以加abstract修饰方法吗?

像这样:

public interface AbstractInterface {
    abstract void func();
}

 编译反编译一下,看看结果:

结果还是一样,javac会自动给方法加上abstract,即使没有abstract修饰interface。

【总结】:

(1)可以给interface加上abstract,但是没什么用,javac会自动去掉interface前面的abstract。

(2)接口里的方法,不加任何修饰符,javac会默认给加上public abstract修饰符。

猜你喜欢

转载自blog.csdn.net/guohengcook/article/details/81394998