接口中是不能定义实例变量的,一方面接口不能实例化,实现都是交给实现类去完成的,那么在接口内定义“实例变量”会怎么样呢?
- 接口
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,是因为编译器帮我们加上的。
网友评论