天天看点

探究java接口中的变量与方法

关于变量

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);
    }
    }