类加载机制-字段解析(同名字段)

原创:转载需注明原创地址 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,子接口中的相同变量会覆盖父接口中的相同变量。

  附上类初始化的规则:当一个类在初始化时,要求其父类全部都已经初始化过了,但是一个接口在初始化时,并不要求其父接口全部都完成了初始化,只有在真正使用到父接口的时候(如引用接口中定义的常量)才会初始化。

  结束🔚

 

posted @ 2019-09-01 10:43  前往幸福的路上  阅读(389)  评论(0编辑  收藏  举报