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. dmsg命令使用

    http://note.youdao.com/noteshare?id=6771284da9f10ac35652907898d63141

  2. linux 内存计算

    原文: http://www.open-open.com/lib/view/open1424325362577.html Linux中的Cache Memory 什么是Cache Memory(缓存内 ...

  3. z-index详细攻略

    概念 z-index 属性设置元素的堆叠顺序.拥有更高堆叠顺序的元素总是会处于堆叠顺序较低的元素的前面. 层级关系的比较 1. 对于同级元素,默认(或position:static)情况下文档流后面的 ...

  4. Restful 接口传递参数

    首先补充一下什么是 Restful ,这里简单说一下,如果一个架构符合REST原则,就称它为RESTful架构. RESTful架构特点: (1)每一个URI代表一种资源: (2)客户端和服务器之间, ...

  5. 关于NuGet

    一.NuGet是什么? NuGet是Microsoft开发平台的程序集包管理器,它由客户端工具和服务端站点组成,客户端工具提供给用户管理和安装/卸载软件程序包,以及打包和发布程序包到NuGet服务端站 ...

  6. flex布局语法(阮一峰)

    Flex 布局教程:语法篇   作者: 阮一峰 日期: 2015年7月10日 网页布局(layout)是CSS的一个重点应用. 布局的传统解决方案,基于盒状模型,依赖 display属性 + posi ...

  7. python初步学习-生成式、生成器、迭代器、装饰器

    生成式 列表生成式 字典生成式 集合生成式 嵌套列表生成式 列表生成式 列表生成式是python受欢迎的语法之一,通过一句简洁的语法就可以对一组元素进行过滤,还可以对得到的元素进行转换处理.语法格式为 ...

  8. 【zTree】zTree的3.5.26静态树与动态树(实用)

    1.静态树: 目录结构:(css与js为下载的原文件夹)

  9. Java源码-HashMap(jdk1.8)

    一.hash方法 如下是jdk1.8中的源码 static final int hash(Object key) { int h; return (key == null) ? 0 : (h = ke ...

  10. flask基础之安装和使用入门(一)

    前言 Flask框架作为一个python极简化的web框架,它不像Django那样的重型,非常适合快速开发一些小型的应用.本人用flask开发了几个项目之后,慢慢研究flask底层的一些原理,开始一步 ...