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. DWZ简介及其使用

    来源:http://blog.csdn.net/t123012009065/article/details/8286826 DWZ简介:   DWZ富客户端框架(jQuery RIA framewor ...

  2. sql语法图

  3. 你好,C++(13)这道单选题的答案是A、B、C还是D?3.7 枚举类型

    3.7  枚举类型 除了之前我们介绍的数值数据和文字数据之外,在现实世界中,常常还会遇到这样一类数据:一道单选题的答案只能是A.B.C.D四个选项中的某一个:红绿灯的颜色只能是红色,绿色和黄色中的某一 ...

  4. CentOS 7 之Cisco Anyconnect Secure Mobility Client

    公司使用的是Cisco VPN, 于是准备使用一下.先登录公司的vpn页面,意料之中的失败,所以下载了vpnsetup.sh这个来手动安装. 手动是要用root的,不过由于我是个人学习使用机器,一直用 ...

  5. javascript之闭包深入理解(一)

    曾经在开始学习javascript的时候,很是不理解闭包的概念.今天想对它详细的剖析. 在说清楚闭包之前,必须先清楚作用域链. 作用域链 我们知道,执行环境是js中最为重要的一个概念.执行环境定义了变 ...

  6. ECSTORE 关于前台页面DIALOG的调用

    在需调用dialog的html页面中插入本段代码. link='<{link app=test ctl=site_test act=abc}>'; var dialog = new Dia ...

  7. Array and its point.

    a is the array name. &a is the ponit of 2-D array which contains a[5]. the type of &a should ...

  8. console调试--转

    目录: 一.什么是 Console 二 .什么浏览器支持 Console 三.为什么不直接使用 alert 或自己写的 log 四.console.log(object[,object,.....]) ...

  9. oldboy第四天学习

    一.感觉上课没有太多的知识.也可以去理解.但是作业太难了... 二.hash() #python里面的哈希类型是在一个程序中不变,如果换了python 哈希是不#一样的. #字典为什么快,因为他把字典 ...

  10. MongoDB insert/update/one2many案例

    以博文与评论为例,博文有标题内容,对应多个评论,评论有评论人.评论内容等. ()插入一条博文: db.blog.insert( {','title':'this is blog title1','co ...