从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修饰符。