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. expected function body after function declarator

    我出现这个错误是在pch中添加了一个a.h文件 然后在其他文件的b.h文件中就出现这个错误.. 后来排查出原因是: 在pch中, 这个a.h文件在b.h文件之后, 所以在b.h中使用的时候就会报错

  2. git add相关

    git add -A stages All git add . stages new and modified, without deleted git add -u stages modified ...

  3. PHP中的定界符格式

    <?php //nowdoc(单引号定界符) //ABC可以是任合内容,放在单引号中 $c=<<<'ABC' 这里可以是任合内容 我是历的苛夺基 本原则叶落归根在运 输费艰难田 ...

  4. 武汉科技大学ACM :1007: 华科版C语言程序设计教程(第二版)习题7.10

    Problem Description 输入n(n<100)个字符串,每个字符串长度不超过1000,将他们按字典顺序输出. Input 多组测试样例. 每组第一行有一个整数n表示有n个字符串. ...

  5. C++拾遗(七)函数相关(2)

    内联函数 内联函数与常规函数的区别在于: 1.常规函数:在执行调用指令时,先存储该指令的内存地址,将函数参数复制到堆栈,然后跳转到被调用函数起点的内存单元,执行函数,将返回值放 入寄存器,最后跳回到一 ...

  6. IIS下图片防盗连设置详解

    小站只有100个IIS,盗链后经常是连主页都打不开,就想着弄个图片防盗链,在网上找了一下资料,正则表达式的写法啊,ISAPI_REWRITE基本配置啊等等,找来啃了一天终于发现有三个方法实现. 第一. ...

  7. 64位系统中开启32位应用,特别是OLEDB

    IIS7 - Running 32-bit and 64-bit ASP.NET versions at the same time on different worker processes IIS ...

  8. 使用minidwep-gtk-PJ-wifi教程中文版

  9. MSP430单片机的中断

    这篇文章是从网上转载过来的,原文章地址:http://www.21ic.com/jichuzhishi/mcu/questions/2012-12-21/154794.html 中断是MSP430微处 ...

  10. clone database and rename

    使用 management studio right click database -> Tasks -> Generate Scripts -> next until " ...