Chapter5_初始化与清理_构造器初始化
一、构造器初始化的基本顺序
在使用构造器进行初始化时,最需要注意的是初始化的顺序,这种方法可以给初始化的顺序带来很大的灵活性。看如下的一个例子。
class Window{
Window(int marker){
System.out.println("Window(" + marker + ")");
}
}
class House{
Window w1 = new Window(1);
House(){
System.out.println("House()");
w3 = new Window(33);
}
Window w2 = new Window(2);
void f(){
System.out.println("f()");
}
Window w3 = new Window(3);
}
public class test{
public static void main(String args[]){
House h = new House();
h.f();
}
}
Window(1)
Window(2)
Window(3)
House()
Window(33)
f()
从输出中我们可以看出来,初始化的顺序有两点最基本的需要注意:
(1)成员初始化是默认第一个进行的,由编译器控制执行,发生在调用这个类构造器之前,不能阻止其发生。
(2)变量定义的先后顺序决定了初始化的顺序,即使这些变量定义散布在方法定义之间,变量的初始化仍会在任何方法被调用之前执行。
二、静态数据的初始化
先看一个例子。
class Bowl{
Bowl(int marker){
System.out.println("Bowl(" + marker + ")");
}
void f1(int marker){
System.out.println("f1(" + marker + ")");
}
}
class Table{
static Bowl bowl1 = new Bowl(1);
Table(){
System.out.println("Table()");
bowl2.f1(1);
}
void f2(int marker){
System.out.println("f2(" + marker + ")");
}
static Bowl bowl2 = new Bowl(2);
}
class Cupboard{
Bowl bowl3 = new Bowl(3);
static Bowl bowl4 = new Bowl(4);
Cupboard(){
System.out.println("Cupborad()");
bowl4.f1(2);
}
void f3(int marker){
System.out.println("f3(" + marker + ")");
}
static Bowl bowl5 = new Bowl(5);
}
public class test{
public static void main(String args[]){
System.out.println("creating new cupboard() in main");
new Cupboard();
System.out.println("creating new cupboard() in main");
new Cupboard();
table.f2(1);
cupboard.f3(1);
}
static Table table = new Table();
static Cupboard cupboard = new Cupboard();
}
Bowl(1)
Bowl(2)
Table()
f1(1)
Bowl(4)
Bowl(5)
Bowl(3)
Cupborad()
f1(2)
creating new cupboard() in main
Bowl(3)
Cupborad()
f1(2)
creating new cupboard() in main
Bowl(3)
Cupborad()
f1(2)
f2(1)
f3(1)
从输出可以看出来当有静态成员变量存在时,初始化的顺序是,先对静态的成员变量进行顺序初始化,再对非静态的成员变量进行顺序初始化,需要注意的是,由于静态变量是一块共享的内存区域,所以某个类的静态变量只会被初始化一次。
书上总结了创建一个对象的编译器的详细过程(假设类为dog):
(1)由于构造器是静态方法,当首次创建类型为Dog的对象时,或者首次访问静态域时,java解释器首先会查找类路径,定位dog.class文件。
(2)首次加载dog.class,然后执行一次静态初始化的动作。
(3)用new dog()创建对象时,先在堆上给dog分配足够的内存空间。
(4)将这块存储空间清零,会将dog中的所有成员变量变为默认值。
(5)执行出现于字段定义处的初始化动作。
(6)执行构造器。
Chapter5_初始化与清理_构造器初始化的更多相关文章
- Chapter5_初始化与清理_数组初始化与可变参数列表
一.数组初始化 数组是相同类型的,用一个标识符名称封装到一起的一个对象序列或基本类型数据序列.编译器是不允许指定数组的长度的,当使用语句int[] a时,拥有的只是一个符号名,即一个数组的引用,并不拥 ...
- Chapter5_初始化与清理_成员初始化
在java中,成员初始化在使用之前应该都要保证已经完成初始化.对于在方法体中的局部变量,如果没有使用指定初始化的方法对成员变量进行初始化,编译器会提示一个错误.而对于类的数据成员,编译器会对这些成员赋 ...
- Chapter5_初始化与清理_用构造器初始化
接下来进入第五章,java中初始化和清理的问题,这是两个涉及安全的重要命题.初始化的功能主要是为库中的构件(或者说类中的域)初始化一些值,清理的功能主要是清除程序中不再被需要的元素,防止资源过分被垃圾 ...
- 图解 & 深入浅出Java初始化与清理:构造器必知必会
Writer :BYSocket(泥沙砖瓦浆木匠) 微 博:BYSocket 豆 瓣:BYSocket FaceBook:BYSocket Twitter ...
- Chapter5_初始化与清理_方法重载
方法重载是java中编译器在方法调用时采用的一个重要机制.起初方法重载的初衷是方便构造器的调用,比如对于一个类,可以实现用不同的方法来初始化它,又由于构造器的名称都是一样的,所以必须使用到方法重载的机 ...
- java编程思想第五章初始化与清理
5.1使用构造器确保初始化: 构造器与一般方法一样,但是没有返回值,且其方法名与类名完全相同. 不接受任何参数的构造器成为默认构造器,也叫无参构造器. 5.2 方法重载: 为什么会有方法重载? 构造器 ...
- 20190816 On Java8 第六章 初始化和清理
第六章 初始化和清理 利用构造器保证初始化 在 Java 中,类的设计者通过构造器保证每个对象的初始化. 构造器名称与类名相同. 在 Java 中,对象的创建与初始化是统一的概念,二者不可分割. 方法 ...
- 《 Java 编程思想》CH05 初始化与清理
< Java 编程思想>CH05 初始化与清理 用构造器确保初始化 在 Java 中,通过提供构造器,类的设计者可确保每个对象都会得到初始化.Java 会保证初始化的进行.构造器采用与类相 ...
- [THINKING IN JAVA]初始化和清理
4.5初始化和清理 5.1 构造器初始化 无参:如果一个类没有构造器,那么会有一个默认的无参构造器,并且只能通过无参构造器初始化对象: 带参:传入参数初始化成员变量或者其它初始化操作需要的参数,如果类 ...
随机推荐
- SSM的搭建
1.首先是工具的准备. eclipse jdk1.7 maven 3.5.4 tomcat 8.5 2.工具环境的搭建 首先,new建立选择maven project工程,勾选simple proje ...
- mycat数据中间件、nginx
MyCat & Nginx 课程目标 目标1:理解MyCat分片,能够配置MyCat分片 目标2:掌握Nginx的安装与静态网站部署 目标3:掌握Nginx的静态网站部署 目标4:理解N ...
- redis 安装启动
1.解压 tar -zxvf redis文件 2. make 3. cp redis-server redis-cli /usr/local/redis cp redis.conf /usr/loca ...
- laravel框架memcached的使用
在laravel配置及使用使用 Memcached 缓存要求安装了Memcached PECL 包,即 PHP Memcached 扩展.你可以在配置文件 config/cache.php 中列出所有 ...
- C 语言 字符串命令 strstr()的用法 实现将原字符串以分割串分割输出
C 语言 字符串命令 strstr()的用法 实现将原字符串以分割串分割输出 strstr() 命令是在原字符串中查找指定的字符串第一次出现的地址,用这个特性可以实现字符的分割,判断是否包涵等功能: ...
- Java环境变量配置----JDK开发环境及环境变量设置
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/3 ...
- 读取文件不是真实的具体路径 setZh.ini
读取 c:\windows\Syswow64\XX\XX.ini 时内容不正确. 发现真实文件为: C:\Users\用户名\AppData\Local\VirtualStore\Windows\Sy ...
- std::condition_variable::wait_until segment
原因是使用了 -static 改为 -static-libstdc++ -static-libgcc
- 吴裕雄 python 机器学习——Lasso回归
import numpy as np import matplotlib.pyplot as plt from sklearn import datasets, linear_model from s ...
- 使用Log4J收集日志
一:搭建好Selenium+testNG+Maven环境,可参考 http://www.cnblogs.com/hc1020/p/8602863.html 二:百度搜索Maven仓库,然后搜索Log4 ...