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
```
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 = 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";
// public static String c = "C";
// public static final String c = new String("C");
public static String c = new String("C");
} class B extends A {
static {
System.out.print("B");
}
}

参考答案

```
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"; // C
// 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");

}

}

</div>

<blockquote><b>总结:</b>
1、如果一个 <b>static final</b> 变量是<b>"编译期常量"</b>,就像 <i style="color:red;">public static final String a = "JD";</i>那样,那么这个值不需要对 Test2 类进行初始化就可以读取。 2、但是,如果只是将一个变量的域设置为 static 和 final 的,那<b>不足以</b>确保这种行为。例如,对 <i style="color:red;">public static final String a = new String("JD");</i>的访问将强制对 Test2 类进行初始化,因为<b>它不是</b>一个"编译期常量"。 3、如果一个 static 变量域不是 final,那么在对它进行访问时,总是要求在它被读取之前,要先进行<b>链接</b> (为这个域分配存储空间) 和<b>初始化</b> (初始化该存储空间) 就像 <i style="color:red;">public static String a = "JD";</i>。
</blockquote> **参考链接**
* [https://blog.csdn.net/dreamzuora/article/details/80188708](https://blog.csdn.net/dreamzuora/article/details/80188708)

Java 中静态代码块初始化问题测试的更多相关文章

  1. java中静态代码块初始化顺序

    (一)java 静态代码块 静态方法区别    一般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化,在不创建对象的情况下, ...

  2. Java中静态代码块、构造代码块、构造函数、普通代码块

    在Java中,静态代码块.构造代码块.构造函数.普通代码块的执行顺序是一个笔试的考点,通过这篇文章希望大家能彻底了解它们之间的执行顺序. 1.静态代码块 ①.格式 在java类中(方法中不能存在静态代 ...

  3. java中静态代码块,非静态代码块,构造函数

    关于静态代码块 静态代码块的写法: static { System.out.println("我是静态代码块"); } 静态代码块的特点: 1.执行优先级高于非静态的初始化块,它会 ...

  4. (转)java中静态代码块的用法 static用法详解

    一)java 静态代码块 静态方法区别一般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化,在不创建对象的情况下,其他程序来 ...

  5. java中静态代码块的用法 static用法详解(转)

    (一)java 静态代码块 静态方法区别一般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化,在不创建对象的情况下,其他程序 ...

  6. 【转】java中静态代码块的用法 static用法详解

    原文网址:http://www.cnblogs.com/panjun-Donet/archive/2010/08/10/1796209.html (一)java 静态代码块 静态方法区别一般情况下,如 ...

  7. java中静态代码块的用法 static用法详解

    (一)java 静态代码块 静态方法区别一般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化,在不创建对象的情况下,其他程序 ...

  8. [转载] java中静态代码块的用法 static用法详解

    一.java 静态代码块 静态方法区别 一般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化,在不创建对象的情况下,其他程序 ...

  9. java中静态代码块的用法和static用法(转)

    (一)java 静态代码块 静态方法区别 一般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化,在不创建对象的情况下,其他程 ...

随机推荐

  1. u3d摄像机截图

    using System; using UnityEngine; using System.Collections; public class TestCamreaCapture1 : MonoBeh ...

  2. 多重检验_LSD方法不准确性

    sklearn实战-乳腺癌细胞数据挖掘(博客主亲自录制视频教程) https://study.163.com/course/introduction.htm?courseId=1005269003&a ...

  3. 查看MySQL日志数据binlog文件

    binlog介绍 binlog,即二进制日志,它记录了数据库上的所有改变. 改变数据库的SQL语句执行结束时,将在binlog的末尾写入一条记录,同时通知语句解析器,语句执行完毕. binlog格式 ...

  4. Order By 问题集合

    问题(一):Order By 多个参数排序 在做多字段的排序的时候我们经常会会用到该语句. 所以多参数排序是从左到右的局部排序,修改的范围只有前面参数(几个参数)相同的情况下在排序. select * ...

  5. python中拷贝对象的区别

    一.赋值.引用 在python中赋值语句总是建立对象的引用值,而不是复制对象.因此,python变量更像是指针,而不是数据存储区域 这点和大多数语音类似吧,比如C++.Java等 1.先看个例子: v ...

  6. PHP扩展--vld查看opcode代码

    vld安装 wget http://pecl.php.net/get/vld-0.13.0.tgz tar zxvf vld-0.13.0.tgz cd vld-0.13.0 /usr/local/p ...

  7. 谨慎重载clone方法

    本文涉及到的概念 1.浅拷贝和深拷贝 2..clone方法的作用和使用方式 3.拷贝构造器和拷贝工厂   1.浅拷贝和深拷贝 浅拷贝 一个类实现Cloneable接口,然后,该类的实例调用clone方 ...

  8. Global.asax文件—ASP.NET细枝末节(1)

    说明 Global的解释是全局的.全球的. Global.asax 文件,有时候叫做 ASP.NET 应用程序文件,提供了一种在一个中心位置响应应用程序级或模块级事件的方法.你可以使用这个文件实现应用 ...

  9. h5+js随机拖动鼠标产生动画效果

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  10. NYOJ 267 郁闷的C小加(二) (字符串处理)

    题目链接 描述 聪明的你帮助C小加解决了中缀表达式到后缀表达式的转换(详情请参考"郁闷的C小加(一)"),C小加很高兴.但C小加是个爱思考的人,他又想通过这种方法计算一个表达式的值 ...