关于变量

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可以修饰方法了,而且得也有方法体