1.初始化顺序是由变量在类内的定义顺序决定的,并且先初始化变量,然后才调用构造函数。

package chapter4;

//: OrderOfInitialization.java
/**
* 初始化顺序
*/
class Tag {
Tag(int marker) {
System.out.println("Tag(" + marker + ")");
}
} class Card {
Tag t1 = new Tag(); // Before constructor Card() {
// Indicate we're in the constructor:
System.out.println("Card()");
t3 = new Tag(); // Re-initialize t3
} Tag t2 = new Tag(); // After constructor void f() {
System.out.println("f()");
} Tag t3 = new Tag(); // At end
} public class OrderOfInitialization {
public static void main(String[] args) {
Card t = new Card();
t.f(); // Shows that construction is done
} } // /:~

【运行结果】:

Tag(1)
Tag(2)
Tag(3)
Card()
Tag(33)
f()

2. 静态数据的初始化

先来看看main函数所在类。main是程序的入口,调用一切对象必须先实例化。

package chapter4;
public class StaticInitialization {
public static void main(String[] args) {
StaticInitialization s = new StaticInitialization();
System.out.println("i="+s.i);
}
int i;
}

【运行结果】:i=0

如果变量为静态,将在main函数之前初始化。

package chapter4;
public class StaticInitialization1 {
public static void main(String[] args) {
System.out.println("i="+i);
} static int i=5;
}

【运行结果】:i=5

实例化类将默认调用构造函数

package chapter4;
class Table {
Table() {
System.out.println("Table()");
}
} public class StaticInitialization1 {
public static void main(String[] args) {
Table t2 = new Table(); }
}

【运行结果】:Table()

如果变量为静态,将在main函数之前初始化。同样适用于类(类是一种自定义变量)

package chapter4;
class Table {
Table() {
System.out.println("Table()");
}
} public class StaticInitialization1 {
public static void main(String[] args) { } static Table t2 = new Table();
}

【运行结果】:Table()

类内变量、静态变量初始化及构造函数调用顺序:

静态变量、变量、构造函数

package chapter4;

class Bowl {
Bowl(int marker) {
System.out.println("Bowl(" + marker + ")");
}
}
class Table {
Bowl b1 = new Bowl(1); Table() {
System.out.println("Table()");
} static Bowl b2 = new Bowl(2);
} public class StaticInitialization1 {
public static void main(String[] args) { } static Table t2 = new Table();
}

【运行结果】:

Bowl(2)
Bowl(1)
Table()

static 初始化仅发生一次

package chapter4;

class Bowl {
Bowl(int marker) {
System.out.println("Bowl(" + marker + ")");
} void f(int marker) {
System.out.println("f(" + marker + ")");
}
} class Table {
Bowl b1 = new Bowl(1); Table() {
System.out.println("Table()");
} void f2(int marker) {
System.out.println("f2(" + marker + ")");
} static Bowl b2 = new Bowl(2);
} public class StaticInitialization1 {
public static void main(String[] args) {
System.out.println("=========main===========");
Table t3 = new Table();
t2.f2(2);
} static Table t2 = new Table();
}

【运行结果】:

Bowl(2)
Bowl(1)
Table()
=========main===========
Bowl(1)
Table()
f2(2)

静态块:仅执行一次——首次生成那个类的一个对象时,或者首次访问属于那个类的一个static 成员时

//: ExplicitStatic.java
// Explicit static initialization
// with the "static" clause.
class Cup {
Cup(int marker) {
System.out.println("Cup(" + marker + ")");
}
void f(int marker) {
System.out.println("f(" + marker + ")");
}
}
class Cups {
static Cup c1;
static Cup c2;
static {
c1 = new Cup(1);
c2 = new Cup(2);
}
Cups() {
System.out.println("Cups()");
115
}
}
public class ExplicitStatic {
public static void main(String[] args) {
System.out.println("Inside main()");
Cups.c1.f(99); // (1)
}
static Cups x = new Cups(); // (2)
static Cups y = new Cups(); // (2)
} ///:~

【运行结果】:

Cup(1)
Cup(2)
Cups()
Cups()
Inside main()
f(99)

非静态实例的初始化可定义成与静态块类似的形式:

package chapter4;

//: Mugs.java
// Java 1.1 "Instance Initialization"
class Mug {
Mug(int marker) {
System.out.println("Mug(" + marker + ")");
}
} public class Mugs {
Mug c1;
Mug c2;
{
c1 = new Mug(1);
c2 = new Mug(2);
System.out.println("c1 & c2 initialized");
} Mugs() {
System.out.println("Mugs()");
} public static void main(String[] args) {
System.out.println("Inside main()");
Mugs x = new Mugs();
}
} // /:~

【运行结果】:

Inside main()
Mug(1)
Mug(2)
c1 & c2 initialized
Mugs()

这段定义代码

{
        c1 = new Mug(1);
        c2 = new Mug(2);
        System.out.println("c1 & c2 initialized");
    }

看起来与静态初始化从句极其相似,只是static 关键字从里面消失了。为支持对“匿名内部类”的初始化必须采用这一语法格式。

(三)《Java编程思想》——构造函数初始化的更多相关文章

  1. 《Java编程思想》——初始化与清理(一)读书笔记

    第一次写这个,这一章都用word写的,结果复制过来没图片....只能上传word文档了.以后改用markdown比较好 word文档地址:<Java编程思想>--初始化与清理(一)读书笔记

  2. Java编程思想之五初始化与清理

    随着计算机革命的发展,"不安全"的编程方式已经逐渐称为编程代价高昂的主因之一. 初始化和清理正是涉及安全的两个问题. 5.1 用构造器确保初始化 通过提供构造器,类的设计者可确保每 ...

  3. 《java编程思想》 初始化与清理

    1.初始化与清理的重要性: 1.许多C程序的错误都源于程序员忘记初始化变量,特别是使用程序库时,如果不知道如何初始化库的构件更容易出错 2.当使用完一个元素时,这个元素就不会有什么影响了,所以很容易就 ...

  4. (六)《Java编程思想》——初始化及类的加载顺序

    package chapter7; /** * 初始化及类的加载顺序:顺序如下 * 1.基类的static变量 * 2.导出类的static变量 * 3.基类的变量 * 4.基类的构造函数 * 5.导 ...

  5. Java编程思想——第17章 容器深入研究 读书笔记(三)

    七.队列 排队,先进先出. 除并发应用外Queue只有两个实现:LinkedList,PriorityQueue.他们的差异在于排序而非性能. 一些常用方法: 继承自Collection的方法: ad ...

  6. 《Java编程思想》读书笔记(三)

    前言:三年之前就买了<Java编程思想>这本书,但是到现在为止都还没有好好看过这本书,这次希望能够坚持通读完整本书并整理好自己的读书笔记,上一篇文章是记录的第十一章到第十六章的内容,这一次 ...

  7. Java编程思想——初始化与清理

    PS:最近一直忙于项目开发..所以一直没有写博客..趁着空闲期间来一发.. 学习内容: 1.初始化 2.清理 1.初始化   虽然自己的Java基础还是比较良好的..但是在解读编程思想的时候还是发现了 ...

  8. 《 Java 编程思想》CH05 初始化与清理

    < Java 编程思想>CH05 初始化与清理 用构造器确保初始化 在 Java 中,通过提供构造器,类的设计者可确保每个对象都会得到初始化.Java 会保证初始化的进行.构造器采用与类相 ...

  9. JAVA编程思想读书笔记(三)--RTTI

    接上篇JAVA编程思想读书笔记(二) 第十一章 运行期类型判定 No1: 对于作为程序一部分的每个类,它们都有一个Class对象.换言之,每次写一个新类时,同时也会创建一个Class对象(更恰当的说, ...

  10. Java编程思想重点笔记(Java开发必看)

    Java编程思想重点笔记(Java开发必看)   Java编程思想,Java学习必读经典,不管是初学者还是大牛都值得一读,这里总结书中的重点知识,这些知识不仅经常出现在各大知名公司的笔试面试过程中,而 ...

随机推荐

  1. Swift - 35 - 使用闭包简化语法

    //: Playground - noun: a place where people can play import UIKit // 初始化一个整数数组 var arr = [1, 3, 5, 7 ...

  2. Linq中字段数据类型转换问题(Linq to entity,LINQ to Entities 不识别方法"System.String ToString()"问题解决)

    1.在工作中碰到这样一个问题: 使用linq时,需要查询两个表,在这两张表中关联字段分别是int,和varchar()也就是string,在linq中对这两个字段进行关联, 如果强制类型转换两个不同类 ...

  3. 单点登录CAS使用记(二):部署CAS服务器以及客户端

    CAS-Server下载地址:https://www.apereo.org/projects/cas/download-cas CAS-Client下载地址:http://developer.jasi ...

  4. swing常用布局

    1,FlowLayout 窗口的默认布局 设置窗口布局方法(下面不重复 setLayout(new FlowLayout()); 设置容器布局方法 比如容器 con1 con1.setLayout(n ...

  5. C++中基类对象的引用

    代码: #include <iostream> #include <cstdio> using namespace std; class A{ public: void pri ...

  6. 磁盘阵列RAID

                                                                                  磁盘阵列RAID 年提出的.RAID名为独立 ...

  7. 准备开发一个基于canvas的图表库,记录一些东西(一)

    开源的图表库已经有很多了,这里从头写个自己的,主要还是 提高自己js的水平,增加复杂代码组织的经验 首先写一个画图的库,供以后画图表使用.经过2天的开发,算是能拿出点东西了,虽然功能还很弱,但是有了一 ...

  8. svn用法

    SVN安装与启动服务 1.下载相应匹配版本的TortoiseSVN(客户端)和Subversion(客户端),安装完毕之后. 2.配置相关文件. 选择TortoiseSVN-->create r ...

  9. PDO封装函数

    header("Content-type: text/html; charset=utf-8"); /** * 初始化 pdo 对象实例 * @param bool $newins ...

  10. Django新手图文教程

    Django新手图文教程 本文面向:有python基础,刚接触web框架的初学者. 环境:windows7   python3.5.1  pycharm专业版  Django 1.10版 pip3 一 ...