Java接口中的field

接口中是不能定义实例变量的,一方面接口不能实例化,实现都是交给实现类去完成的,那么在接口内定义“实例变量”会怎么样呢?

  • 接口
public interface TestI {

    String name0 = "ddd";
    final String name1 = "aaa";
    static String name2 = "bbb";
    static final String name3 = "ccc";

    void test();

    default void test2() {
        System.out.println("hello");
    }
}
  • 实现类
public class TestIImpl implements TestI {

    @Override
    public void test() {
        System.out.println(name0);
        System.out.println(name1);
        System.out.println(name2);
        System.out.println(name3);
    }
    public static void main(String[] args) {
        new TestIImpl().test();
        System.out.println("---");
        // TestI.name3="1000"; Error 提示是final域,不能修改
        System.out.println(TestI.name0);
        System.out.println(TestI.name1);
        System.out.println(TestI.name2);
        System.out.println(TestI.name3);
    }

}

在实现类中,可以直接访问接口中定义的“实例变量”,既可以直接引用,也可以使用TestI.var来引用,即使没有声明为static。且修改的时候会报错,提示不能修改接口中定义的域。为什么会这样呢?难道我们看到的并非我是简单看到的?
反编译一下看看接口:

$ javap TestI
警告: 二进制文件TestI包含jdk.interfaces.TestI
Compiled from "TestI.java"
public interface jdk.interfaces.TestI {
  public static final java.lang.String name0;
  public static final java.lang.String name1;
  public static final java.lang.String name2;
  public static final java.lang.String name3;
  public abstract void test();
  public void test2();
}

原来,编译器把接口中定义的变量统统变成常量,所以他们都是常量;
另外可以发现,接口的方法可以不加访问修饰符默认是public,是因为编译器帮我们加上的。

你可能感兴趣的:(Java接口中的field)