`
modabobo
  • 浏览: 509853 次
文章分类
社区版块
存档分类
最新评论

java static数据的初始化

 
阅读更多

无论创建多少对象,static数据都只只用一份存储区域。static关键字不能应用于局部变量,因此他只能这用于域。如果一个域是基本类型,并且没有给它初始化,那么他会默认为基本类型的标准初始值;如果是一个引用,那么他会默认为初始值null。

想要了解静态域是如何初始化的,请看下面的例子。

package initialization;

//: initialization/StaticInitialization.java
// Specifying initial values in a class definition.
import static net.mindview.util.Print.*;

class Bowl {
Bowl(int marker) {
print("Bowl(" + marker + ")");
}
void f1(int marker) {
print("f1(" + marker + ")");
}
}

class Table {
static Bowl bowl1 = new Bowl(1);
Table() {
print("Table()");
bowl2.f1(1);
}
void f2(int marker) {
print("f2(" + marker + ")");
}
static Bowl bowl2 = new Bowl(2);
}

class Cupboard {
Bowl bowl3 = new Bowl(3);
static Bowl bowl4 = new Bowl(4);
Cupboard() {
print("Cupboard()");
bowl4.f1(2);
}
void f3(int marker) {
print("f3(" + marker + ")");
}
static Bowl bowl5 = new Bowl(5);
}

public class StaticInitialization {
public static void main(String[] args) {
print("Creating new Cupboard() in main");
new Cupboard();
print("Creating new Cupboard() in main");
new Cupboard();
table.f2(1);
cupboard.f3(1);
}
static Table table = new Table();
static Cupboard cupboard = new Cupboard();
}

/* Output:
Bowl(1)
Bowl(2)
Table()
f1(1)
Bowl(4)
Bowl(5)
Bowl(3)
Cupboard()
f1(2)
Creating new Cupboard() in main
Bowl(3)
Cupboard()
f1(2)
Creating new Cupboard() in main
Bowl(3)
Cupboard()
f1(2)
f2(1)
f3(1)
*/
Bowl类使得看到类的创建,而Table类和Cupboard类在他们的类中分别定义了Bowl类的static成员对象。注意在定义静态数据成员之前,Cupboard类先定义了一个Bowl类型的非静态成员bowl3。

由此可见静态数据只有在必要时才进行初始化。如果不创建Table对象,也不引用Talbe的bowl1和bowl2,那么Talbe的bowl1和bowl2永远都不会被创建。只有在第一个Talbe被创建时或第一次访问其中的Bowl类型的静态成员时,他们才会被初始化。此后静态数据不会在被初始化。

通过上面的事例可以总结:在创建一个类时,初始化的顺序是先是静态数据,并且仅初始化一次(如果它们尚未因前面对象的创建或某些动作的执行未被初始化),而后是非静态数据(每次在创建时都会初始化),然后是构造函数。

另外直接用类名调用静态数据和静态方法时,这个类中的所以静态成员都会被初始化(非static成员不会被初始化),前提是他们从未被初始化过。

从结果中可以观察到这一点。要执行main()(stati方法),必须加载StaticInitialization类,然后是StaticInitialization 类中的sataic成员table 和cupboard 的初始化,这将导致Tabel和Cupboard 类中的静态数据也会被初始化。这样在main()未开始之前,所有对象已经被初始化。然而在main()方法在执行创建Cupboard 类对象时,Cupboard 中的static数据不会再被初始化,因为static数据已经在main()之前已经被第一次初始化。

分享到:
评论

相关推荐

    java 静态非静态 字段方法 子类父类构造_初始化顺序!

    java 静态_非静态 字段_方法_代码块 子类父类构造_初始化顺序! 三个class 让你清清楚楚 第一个class java代码如下: package initialOrder; class Parent { // 静态变量 public static String p_StaticField...

    大数据期末大作业-Java岗位数据大屏分析,集成SpringBoot+JPA+Python+Vue2+Echarts

    SQL文件包含了数据库的结构和初始化数据,方便项目的部署和使用。 通过Java岗位数据大屏分析项目,可以帮助用户更好地了解Java岗位的就业情况和趋势,为求职者和招聘方提供参考和决策依据。 效果图都截图在PDF上了...

    java学习笔记-java思维导图流程图表格整理

    三种初始化 25 静态初始化 26 动态初始化 26 默认初始化 26 数组的四个基本特点 27 二维数组 27 Arrays类 28 稀疏数组 29 面向对象编程 32 值传递和引用传递 33 创建和初始化对象 34 封装 34 继承 37 super 37 方法...

    Thinking in java4(中文高清版)-java的'圣经'

    5.4 this关键字 5.4.1 在构造器中调用构造器 5.4.2 static的含义 5.5 清理:终结处理和垃圾回收 5.5.1 finalize()的用途何在 5.5.2 你必须实施清理 5.5.3 终结条件 5.5.4 垃圾回收器如何工作 5.6 成员初始化 ...

    Java开发技术大全(500个源代码).

    errorInit.java 演示变量初始化错误的程序 integerExample.java 演示各种整型变量的使用 isPrime.java 判断素数 leapYearByIf.java 用if语句判断闰年 leapYearByLogical.java 用逻辑表达式判断闰年 lowToUpper...

    java基础核心总结归纳---参考手册--心得手册-学习资料-总结经验

    构造器初始化 15 初始化顺序 16 this 和 super 16 访问控制权限 16 继承 17 多态 17 代理 17 Static 17 Final 17 接⼝和抽象类 18 接⼝ 18 抽象类 18 异常 18 认识 Exception 18 什么是 Throwable 18 常⻅的 ...

    Java 基础核心总结 +经典算法大全.rar

    类的初始化 成员初始化 构造器初始化初始化顺序 数组初始化 对象的销毁 对象作用域 this 和 super 访问控制权限继承 多态组合代理 向上转型static final 接口和抽象类接口 抽象类异常 认 识 Exception 什么是 ...

    JAVA语言程序设计【高清版】.pdf

    107 6.1 数组 107 6.1.1 数组说明和初始化 107 6.1.2 数组的使用 114 6.2 容器和字符串 118 6.2.1 容器 118 6.2.2 字符串 119 习题 123 第7章 Java语言中的异常 126 7.1 异常示例 126 7.2 异常...

    java 编程入门思考

    4.1 由构建器保证初始化 4.2 方法过载 4.2.1 区分过载方法 4.2.2 主类型的过载 4.2.3 返回值过载 4.2.4 默认构建器 4.2.5 this关键字 4.3 清除:收尾和垃圾收集 4.3.1 finalize()用途何在 4.3.2 必须执行清除 4.4 ...

    Java初学者入门教学

    4.1 由构建器保证初始化 4.2 方法过载 4.2.1 区分过载方法 4.2.2 主类型的过载 4.2.3 返回值过载 4.2.4 默认构建器 4.2.5 this关键字 4.3 清除:收尾和垃圾收集 4.3.1 finalize()用途何在 4.3.2 必须执行清除 4.4 ...

    java联想(中文)

    4.1 由构建器保证初始化 4.2 方法过载 4.2.1 区分过载方法 4.2.2 主类型的过载 4.2.3 返回值过载 4.2.4 默认构建器 4.2.5 this关键字 4.3 清除:收尾和垃圾收集 4.3.1 finalize()用途何在 4.3.2 必须执行清除 4.4 ...

    JAVA基础知识精华总结 收藏

    在创建对象时,对象所在类的所有数据成员会首先进行初始化。 基本类型:int型,初始化为0。 如果为对象:这些对象会按顺序初始化。 ※在所有类成员初始化完成之后,才调用本类的构造方法创建对象。 构造方法的...

    Java实现AES加密和解密算法

    /**数据初始化**/ String content = "http://www.mbaike.net"; String password = "1234567890"; /**加密(1)**/ System.out.println("加密前:" + content); byte[] encryptResult = encrypt...

    import java.net.*;import java.io.*;

    ///初始化一个字符串,并且将这个字符串通过套接字连接后按照端口号发送出去 public static void send() { try { DatagramSocket ds=new DatagramSocket(); String str="hello,i am zhanghong.i am a student ...

    JAVA_Thinking in Java

    4.1 由构建器保证初始化 4.2 方法过载 4.2.1 区分过载方法 4.2.2 主类型的过载 4.2.3 返回值过载 4.2.4 默认构建器 4.2.5 this关键字 4.3 清除:收尾和垃圾收集 4.3.1 finalize()用途何在 4.3.2 必须执行清除 4.4 ...

    Thinking in Java 中文第四版+习题答案

    4.1 由构建器保证初始化 4.2 方法过载 4.2.1 区分过载方法 4.2.2 主类型的过载 4.2.3 返回值过载 4.2.4 默认构建器 4.2.5 this关键字 4.3 清除:收尾和垃圾收集 4.3.1 finalize()用途何在 4.3.2 必须执行清除 4.4 ...

    Thinking in Java简体中文(全)

    4.1 由构建器保证初始化 4.2 方法过载 4.2.1 区分过载方法 4.2.2 主类型的过载 4.2.3 返回值过载 4.2.4 默认构建器 4.2.5 this关键字 4.3 清除:收尾和垃圾收集 4.3.1 finalize()用途何在 4.3.2 必须执行清除 4.4 ...

    Thinking in java(中文)

    6.8 final关键字 6.8.1 final数据 6.8.2 final方法 6.8.3 final类 6.8.4 final的注意事项 6.9 初始化和类装载 6.9.1 继承初始化 6.10 总结 6.11 练习 <br>第7章 多形性 7.1 上溯...

    JAVA基础课程讲义

    静态初始化块(经常用来初始化类,加载类信息时执行!) 67 package 68 JDK中的主要包 68 import 68 eclipse的使用 69 继承(extend, inheritance) 70 为什么需要继承?继承的作用? 70 继承介绍 70 如何实现继承? ...

Global site tag (gtag.js) - Google Analytics