类加载机制-字段解析(同名字段)
原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11441625.html
JVM 类加载机制中字段解析中--子类和父类和接口同名字段解析情况。
首先贴出我的验证类:
package interfaces; /** * 字段解析(父类和接口中的字段调用顺序) */ public class FieldResolution { interface Interface0 { //Error:(5, 21) java: 此处不允许使用修饰符private //接口里面的字段和方法只能为公共的 //private int A = 0; int A = 0; } interface Interface1 extends Interface0{ int A = 1; } interface Interface2{ int A = 2; } static class Parent implements Interface1{ public static int A = 3; } static class Sub extends Parent implements Interface2{ public static int A = 4; } public static void main(String[] args){ System.out.println(Sub.A); } }
此时,可以打印出如下信息:
修改一下代码:注释掉Sub中的变量,运行一下
static class Sub extends Parent implements Interface2{ //public static int A = 4; }
控制台报如下异常:
提示Error,父类和实现接口中都有变量A,不知道该解析哪一个了。
再修改一下代码,把Parent类中的变量也注释掉:再运行一下
static class Parent implements Interface1{ //public static int A = 3; } static class Sub extends Parent implements Interface2{ //public static int A = 4; }
提示Error,接口1和接口2里面都有变量A,不知道解析哪个了。
再修改一下代码,把接口1中的变量注释掉:再运行一下
interface Interface1 extends Interface0{ //int A = 1; } interface Interface2{ int A = 2; } static class Parent implements Interface1{ //public static int A = 3; } static class Sub extends Parent implements Interface2{ //public static int A = 4; }
提示Error,接口0和接口2中都有变量A,不知道解析哪个了。
再修改一下代码,如下:
interface Interface0 { //Error:(5, 21) java: 此处不允许使用修饰符private //接口里面的字段和方法只能为公共的 //private int A = 0; int A = 0; } interface Interface1 extends Interface0{ int A = 1; } interface Interface2{ //int A = 2; } static class Parent implements Interface1{ //public static int A = 3; } static class Sub extends Parent implements Interface2{ //public static int A = 4; }
至此,大概明了了,当加载一个类中的变量的时候,首先从这个类里面找,找不到再往父类或者实现接口里面找,碰到同一个变量父类和实现接口里面都有就报Error,子接口中的相同变量会覆盖父接口中的相同变量。
附上类初始化的规则:当一个类在初始化时,要求其父类全部都已经初始化过了,但是一个接口在初始化时,并不要求其父接口全部都完成了初始化,只有在真正使用到父接口的时候(如引用接口中定义的常量)才会初始化。
结束🔚