在深入理解java的abstract class和interface的时候,遇到过很多很小的问题,网上很多的资料给了很多帮助,对于接口的默认修饰符方面参考了一篇博文,很赞同作者自己找工具对源代码进行分析的主动进取的精神,自己积极找出路的做法。转载请注明:http://www.cnblogs.com/BaiLaowu/p/6618117.html
package test;
public interface InterfaceTest {
void todo();
}
/**
* 以下是反编译的内容,接口里的方法默认都是public的、abstract的。
* 并且接口也默认是abstract的。
* @author Laowu
package test;
public abstract interface InterfaceTest {
public abstract void todo();
}
*/
上面用得是第三方的一个反编译工具,
用 Eclipse 反编译插件编译后的结果却不同,如下:
package test;
public interface InterfaceTest {
void todo();
}
接下来一探究竟:
1.创建一个java 接口:
public interface TestInterface {
void say();
}
2.为这个接口添加一个abstract 修饰符
public abstract interface TestInterface {
void say();
}
结果一切正常,它的实现类运行毫不影响。由此可知java接口默认就是abstract的。
3、去掉这个接口的public 修饰符
interface TestInterface {
void say();
}
不报错;同包下的实现类运行正常;异包下的实现类通不过编译。由此可知java接口本身可以是friendly的。(但不可以是private 和protected 的,这和类的声明是一致的)
4.为这个接口里的一个方法添加public 修饰符
public interface TestInterface {
public void say();
}
结果一切正常,它的实现类运行毫不影响。由此可知java接口里的方法默认就是public的。
5、为这个接口里的一个方法添加private 修饰符
public interface TestInterface {
private void say();
}
通不过编译。由此可知java接口里的方法不可以是private 的。
6、为这个接口里的一个方法添加protected 修饰符
public interface TestInterface {
protected void say();
}
通不过编译。由此可知java接口里的方法不可以是protected 的。
7、为这个接口里的一个方法添加abstract 修饰符
public interface TestInterface {
abstract void say();
}
一切正常,它的实现类运行毫不影响。由此可知java接口里的方法默认就是abstract 的。
总结:
java接口本身默认是abstract的;可以是public的,也可以是friendly的,但不可以是private 的,不可以是protected的(否则通不过编译)。
java接口里的方法默认是abstract的,public 的;不可以private 的,不可以是protected 的。
还得出一个结果,这个第三方的反编译工具更准确。下载地址:https://i.cnblogs.com/Files.aspx 文件名:javaDecompiler.rar