zoukankan      html  css  js  c++  java
  • 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";。

     

  • 相关阅读:
    20145317《信息安全系统设计基础》第六周学习总结(1)
    20145317《信息安全系统设计基础》第五周学习总结2
    20145317 《信息安全系统设计基础》第5周学习总结
    20145317《信息安全系统设计基础》第三周学习总结
    20145317 《信息安全系统设计基础》第二周学习总结
    20145317彭垚《信息安全系统设计基础》第1周学习总结
    20145317《信息安全系统设计基础》第0周学习总结
    20145317彭垚 java课程总结
    20145317彭垚 《Java程序设计》第五次实验报告
    20145315 《信息安全系统设计基础》第十周学习总结
  • 原文地址:https://www.cnblogs.com/47Gamer/p/13160742.html
Copyright © 2011-2022 走看看