(三)《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学习必读经典,不管是初学者还是大牛都值得一读,这里总结书中的重点知识,这些知识不仅经常出现在各大知名公司的笔试面试过程中,而 ...
随机推荐
- 你好,C++(28)用空间换时间 5.2 内联函数 5.3 重载函数
5.2 内联函数 通过5.1节的学习我们知道,系统为了实现函数调用会做很多额外的幕后工作:保存现场.对参数进行赋值.恢复现场等等.如果函数在程序内被多次调用,且其本身比较短小,可以很快执行完毕,那么 ...
- jS放大镜效果
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="demo4.aspx.cs& ...
- 让一个Activity在开机后自动显示
Activity本身不会在手机开机后自动运行的.但想让手机开机后就立刻做一些动作,需要使用广播接收器拦截手机开启广播,并在onReceive方法中完成相应的动作,如打开一个Activity. 广播接收 ...
- Mysql 锁粒度
表锁: 表锁是mysql 中最几本的锁策略,并且是开销最小的策略:它会锁定整张表. 一个用户在对表进行锁操作(增,删,改)前,首先要获得写锁,这会阻塞其他用户对该表的所有读写操作.只有没有写锁时,其他 ...
- (function(){})(jQuery)的功能和用途?
1.为什么开发插件都这么写? 2.为什么要穿jQuery进去?在方法中直接用jquery的方法什么的不行吗? 1 首先(function(){})()这种写法 是创建了一个匿名的方法并立即执行(fun ...
- php 编译安装curl 时候出现问题
/usr/bin/ld: ext/curl/.libs/interface.o: undefined reference to symbol 'CRYPTO_set_id_callback@@OPEN ...
- Centos7 wget和普通下载有区别
今天下的禅道 wget和用win下载之后再ssh传过去,效果不一样 wget不能正常启动禅道.回来要探讨一下wget的不同之处,先记下来
- Windows下的SVN环境搭建详解
前言:最近因为要和其他人合作开发项目,所以花时间搭建了SVN的环境. 因为是初次使用SVN,对于SVN的环境搭建很不熟悉,再加上网上的教程都介绍的比较粗略,导致前前后后重做了几次. 当然最终是搭建成功 ...
- 探讨VMP 2.12.3 导入表修复
壳版本:VMProtect.Ultimate.2.12.3 样本:notepad.exe 目的:IAT修复 作者:MrWrong 标题:探讨VMP 2.12.3 导入表修复 只是感兴趣,没有其他目的. ...
- jquery-qrcode在线生成二维码
通过bower进行获取: y@y:ydkt$ bower install jquery-qrcode --save bower not-cached git://github.com/gcusnieu ...