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 简介 Java是由Sun Microsystems公司于1995年5月推出的Java面向对象程序设计...
    子非鱼_t_阅读 9,805评论 1 44
  • 重点掌握 3 类对象和方法 对象就是一个物体 类的独特存在就是一个实例,对实例进行操作叫做方法。方法可以应用于类或...
    Coder大雄阅读 5,014评论 0 2
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,916评论 18 399
  • IntelliJ IDEA上使用AngularJS库的时候没有提示,肯定会让人很郁闷,原因是因为少装了Angula...
    90后的晨仔阅读 7,202评论 1 0
  • 又来到了这个车站。 依旧是人流拥挤。 有人在买票,有人在赶着上车,有人席地而坐,有人在发着呆。 有人在看着这些人。...
    梦饮酒者阅读 988评论 0 0