关于变量
java接口里的变量都是默认 pubic static final的
为啥?
public 接口得能被所有对象调用
static 这个变量是属于接口本身,而不是实现了接口的对象的 具体来说
至于这个问题,是和Java语言的本身机制有关。我们知道Java不支持多继承,但是一个类可是现实多个接口。我们假设有两个接口A和B,而类C实现了接口A和B。假设,此时,A和B中都有一个变量N,如果N不是static类型的,那么在C中该如何区分N到底是A的还是B的呢?而,如果是static类型的,我们可以通过A.N和B.N来区别调用A或者B中的成员变量N。
final 如果变量不是final,那么每个实现接口的类就可以更改这个变量的值,也就违反了OCP原则。
所以下面的声明方式都是OK的
interface TestI{ int a=5; static int b=12; final int k=10; }
不过如果你直接给接口里扔一个int c,且没有指定值就不行了,为什么?因为它是final
关于方法
这个得分java的版本来说
在jdk1.7下
interface TestI{ void a(); abstract void b(); //Illegal modifier for the interface method c; only public & abstract are permitted // protected void c(); // static void d(){ // System.out.println(13); // }; }
看到了把,在1.7下方法可以是public或者abstract的,但是不能出现final或者static,static的情况
interface TestI{ void a(); public void k(); abstract void b(); //Illegal modifier for the interface method c; // only public & abstract are permitted // final void c(); // protected void c(); // static void d(){ // System.out.println(13); // }; }
不过在jdk1.8下
interface TestI{ void a(); public void k(); abstract void b(); //static void f2(); 这个不行 必须得有方法体 //同理default也得有方法体 static void d(){ System.out.println(13); }; default void ss(String zoneString) { System.out.println(123); } }
看到了吧static和default可以修饰方法了,而且得也有方法体
参考资料
关于接口中的变量
http://blog.csdn.net/qiumengchen12/article/details/44852023
关于final的使用
http://blog.csdn.net/dlf123321/article/details/44493691