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";。

     

  • 相关阅读:
    【IDEA】创建Maven工程
    【Java】Input,Output,Stream I/O流 03 系统标准流 & 打印流
    【Java】Reflection 反射机制 03调用
    【Java】JDBC Part2 工具类封装实现
    【郝斌C ST】 指针入门
    【Java】Input,Output,Stream I/O流 02 文件流 & 缓冲流
    margin和padding的区别
    JAVA反射机制
    HTTP错误代码详细介绍
    关于Java继承问题
  • 原文地址:https://www.cnblogs.com/47Gamer/p/13160742.html
Copyright © 2011-2022 走看看