(三)《Java编程思想》——构造函数初始化
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编程思想》——构造函数初始化的更多相关文章
- 《Java编程思想》——初始化与清理(一)读书笔记
		
第一次写这个,这一章都用word写的,结果复制过来没图片....只能上传word文档了.以后改用markdown比较好 word文档地址:<Java编程思想>--初始化与清理(一)读书笔记
 - Java编程思想之五初始化与清理
		
随着计算机革命的发展,"不安全"的编程方式已经逐渐称为编程代价高昂的主因之一. 初始化和清理正是涉及安全的两个问题. 5.1 用构造器确保初始化 通过提供构造器,类的设计者可确保每 ...
 - 《java编程思想》 初始化与清理
		
1.初始化与清理的重要性: 1.许多C程序的错误都源于程序员忘记初始化变量,特别是使用程序库时,如果不知道如何初始化库的构件更容易出错 2.当使用完一个元素时,这个元素就不会有什么影响了,所以很容易就 ...
 - (六)《Java编程思想》——初始化及类的加载顺序
		
package chapter7; /** * 初始化及类的加载顺序:顺序如下 * 1.基类的static变量 * 2.导出类的static变量 * 3.基类的变量 * 4.基类的构造函数 * 5.导 ...
 - Java编程思想——第17章 容器深入研究 读书笔记(三)
		
七.队列 排队,先进先出. 除并发应用外Queue只有两个实现:LinkedList,PriorityQueue.他们的差异在于排序而非性能. 一些常用方法: 继承自Collection的方法: ad ...
 - 《Java编程思想》读书笔记(三)
		
前言:三年之前就买了<Java编程思想>这本书,但是到现在为止都还没有好好看过这本书,这次希望能够坚持通读完整本书并整理好自己的读书笔记,上一篇文章是记录的第十一章到第十六章的内容,这一次 ...
 - Java编程思想——初始化与清理
		
PS:最近一直忙于项目开发..所以一直没有写博客..趁着空闲期间来一发.. 学习内容: 1.初始化 2.清理 1.初始化 虽然自己的Java基础还是比较良好的..但是在解读编程思想的时候还是发现了 ...
 - 《 Java 编程思想》CH05 初始化与清理
		
< Java 编程思想>CH05 初始化与清理 用构造器确保初始化 在 Java 中,通过提供构造器,类的设计者可确保每个对象都会得到初始化.Java 会保证初始化的进行.构造器采用与类相 ...
 - JAVA编程思想读书笔记(三)--RTTI
		
接上篇JAVA编程思想读书笔记(二) 第十一章 运行期类型判定 No1: 对于作为程序一部分的每个类,它们都有一个Class对象.换言之,每次写一个新类时,同时也会创建一个Class对象(更恰当的说, ...
 - Java编程思想重点笔记(Java开发必看)
		
Java编程思想重点笔记(Java开发必看) Java编程思想,Java学习必读经典,不管是初学者还是大牛都值得一读,这里总结书中的重点知识,这些知识不仅经常出现在各大知名公司的笔试面试过程中,而 ...
 
随机推荐
- iOS SearchBar为什么跳不出来第三方输入法
			
去掉键盘类型就好了 // lineSearchBar.keyboardType = UIKeyboardTypeNamePhonePad;
 - 过滤器(filter)实现
			
花了2天时间,实现了过滤器功能,针对数据进行筛选,包含以下7个过滤器: 'date','currency','number','tolowercase','touppercase','orderBy' ...
 - java——JNI(例子控制台(64位)清屏
			
因为java的最底层是jvm,所以单纯的控制台java程序不能感知jvm再下面的操作系统的情况, 可以通过JNI(Java Native Interface)技术实现java后台调用C++/C的dll ...
 - 3D跑酷游戏《月影忍者之疾风狂逃》
			
<月影忍者之疾风狂逃>是一款3D跑酷游戏,也是我实习的时候参与的一个项目,在那个公司我学到了很多东西,谢谢他们.大家可以去玩玩这个游戏啊,还是不错的哦.
 - php的冒泡算法
			
<?php /* 冒泡算法 * @para $arr 传人进去排序的数组 * @return $newArr 排序之后的数组 */ function maopao($arr){ ...
 - php中JPGraph入门配置与应用
			
什么是PHP JPGraph? 专门提供图表的类库.它使得作图变成了一件非常简单的事情.生成非美工人士生成的图表.二维码算法. 到官方网站下载. docportal 帮助手册 src 包含主要代码. ...
 - UNIX时间戳及日期的转换与计算
			
UNIX时间戳是保存日期和时间的一种紧凑简洁的方法,是大多数UNIX系统中保存当前日期和时间的一种方法,也是在大多数计算机语言中表示日期和时间的一种标准格式.以32位整数表示格林威治标准时间,例如,使 ...
 - PHPの页面跳转-常见方法
			
PHP页面跳转一.header()函数 header()函数是PHP中进行页面跳转的一种十分简单的方法.header()函数的主要功能是将HTTP协议标头(header)输出到浏览器. header( ...
 - UBUNTU 下设置全局 path变量
			
全局的对所有用户都可以的使用的PATH: 可以通过修改配置文件: /etc/bashrc 和 /etc/profile 来时配置, 全局的PATH; 例如: vi /etc/profile 在最后后加 ...
 - sql对日期的处理,一个存储过程示例
			
IF v_docType = 3 THEN update T_PATIENT_INFO set USER_NAME =userName ,SEX = v_sex,BIRTHDAY = to_date( ...