• Java中静态代码块初始化问题测试


    Java 中静态代码块初始化问题测试

    情况一变量是 static final 修饰的“编译期常量”,如 public static final String a = "JD";

    public class Test {
    
        public static void main(String[] args) {
            System.out.println(Test2.a);
        }
    
    }
    
    class Test2 {
        public static final String a = "JD";
    
        static {
            System.out.print("OK");
        }
    }
    

    打印结果

    ``` JD ```
     
    情况二变量是 static final 修饰的“非编译期常量”,如 public static final String a = new String("JD");
    public class Test {
    
        public static void main(String[] args) {
            System.out.println(Test2.a);
        }
    
    }
    
    class Test2 {
        public static final String a = new String("JD");
    
        static {
            System.out.print("OK");
        }
    }
    

    打印结果:

    ``` OKJD ```

    情况三static 变量域不是 final,如 public static String a = "JD";

    public class Test {
    
        public static void main(String[] args) {
            System.out.println(Test2.a);
        }
    
    }
    
    class Test2 {
        public static String a = "JD";
        
        static {
            System.out.print("OK");
        }
    }
    

    打印结果:

    ``` OKJD ```

    情况四继承是JAVA语言的一个特性,针对类的继承,虚拟机会如何进行父类和子类的初始化加载呢?

    继承情况如下(请仔细看清区别~~~~~~~): 

    public class Test {
    
        public static void main(String[] args) {
            System.out.print(B.c);
        }
    }
    
    class A {
        static {
            System.out.print("A");
        }
    }
    
    class B extends A {
        static {
            System.out.print("B");
        }
    
        public static final String c = "C";
    }
    

    打印结果:

    ``` C ```

    public class Test {
    
        public static void main(String[] args) {
            System.out.print(B.c);
        }
    }
    
    class A {
        static {
            System.out.print("A");
        }
    }
    
    class B extends A {
        static {
            System.out.print("B");
        }
    
        public static String c = "C";
    }
    

    打印结果:

    ``` ABC ```

    public class Test {
    
        public static void main(String[] args) {
            System.out.print(B.c);
        }
    }
    
    class A {
        static {
            System.out.print("A");
        }
    }
    
    class B extends A {
        static {
            System.out.print("B");
        }
    
        public static String c = new String("C");
    }
    

    打印结果:

    ``` ABC ```
     
    ublic class Test {
    
        public static void main(String[] args) {
            System.out.print(B.c);
        }
    }
    
    class A {
        static {
            System.out.print("A");
        }
    }
    
    class B extends A {
        static {
            System.out.print("B");
        }
    
        public static final String c = new String("C");
    }
    

    打印结果:

    ``` ABC ```
     
    public class Test {
    
        public static void main(String[] args) {
            System.out.print(B.c);
        }
    }
    
    class A {
        static {
            System.out.print("A");
        }
    
        // 测试:只能选择其中一种一条语句
        // public static final String c = "C"; //CC
        // public static  String c = "C"; //AC
        // public static final String c = new String("C"); //AC
        public static String c = new String("C"); //AC
    }
    
    class B extends A {
        static {
            System.out.print("B");
        }
    }

    总结:
    1、如果一个 static final 变量是"编译期常量",就像 public static final String a = "JD";那样,那么这个值不需要对 Test2 类进行初始化就可以读取。

    2、但是,如果只是将一个变量的域设置为 static 和 final 的,那不足以确保这种行为。例如,对public static final String a = new String("JD");的访问将强制对 Test2 类进行初始化,因为它不是一个"编译期常量"。

    3、如果一个 static 变量域不是 final,那么在对它进行访问时,总是要求在它被读取之前,要先进行链接 (为这个域分配存储空间) 和初始化 (初始化该存储空间) 就像public static String a = "JD";。

     

  • 相关阅读:
    java的继承---包装器与自动装箱
    linux开机启动过程,很多人说的不太清楚的看看。
    黑盒测试/三角形(OC)
    git 忽略一些文件的提交
    volley 框架的使用
    如何通过阿里百川的集成,以及manifest的权限配置完成淘客商品详情页的链接
    抓取网站访问者的QQ号码
    写写东西吧
    Android 强制实现下线功能
    Android 新闻显示界面且适应平板
  • 原文地址:https://www.cnblogs.com/47Gamer/p/13160742.html
Copyright © 2020-2023  润新知