一、构造器初始化的基本顺序

  在使用构造器进行初始化时,最需要注意的是初始化的顺序,这种方法可以给初始化的顺序带来很大的灵活性。看如下的一个例子。

  1. class Window{
  2. Window(int marker){
  3. System.out.println("Window(" + marker + ")");
  4. }
  5. }
  6.  
  7. class House{
  8. Window w1 = new Window(1);
  9. House(){
  10. System.out.println("House()");
  11. w3 = new Window(33);
  12. }
  13. Window w2 = new Window(2);
  14. void f(){
  15. System.out.println("f()");
  16. }
  17. Window w3 = new Window(3);
  18. }
  19.  
  20. public class test{
  21. public static void main(String args[]){
  22. House h = new House();
  23. h.f();
  24. }
  25. }
  1. Window(1)
  2. Window(2)
  3. Window(3)
  4. House()
  5. Window(33)
  6. f()

  从输出中我们可以看出来,初始化的顺序有两点最基本的需要注意:

  (1)成员初始化是默认第一个进行的,由编译器控制执行,发生在调用这个类构造器之前,不能阻止其发生。

  (2)变量定义的先后顺序决定了初始化的顺序,即使这些变量定义散布在方法定义之间,变量的初始化仍会在任何方法被调用之前执行。

二、静态数据的初始化

  先看一个例子。

  1. class Bowl{
  2. Bowl(int marker){
  3. System.out.println("Bowl(" + marker + ")");
  4. }
  5. void f1(int marker){
  6. System.out.println("f1(" + marker + ")");
  7. }
  8. }
  9.  
  10. class Table{
  11. static Bowl bowl1 = new Bowl(1);
  12. Table(){
  13. System.out.println("Table()");
  14. bowl2.f1(1);
  15. }
  16. void f2(int marker){
  17. System.out.println("f2(" + marker + ")");
  18. }
  19. static Bowl bowl2 = new Bowl(2);
  20. }
  21.  
  22. class Cupboard{
  23. Bowl bowl3 = new Bowl(3);
  24. static Bowl bowl4 = new Bowl(4);
  25. Cupboard(){
  26. System.out.println("Cupborad()");
  27. bowl4.f1(2);
  28. }
  29. void f3(int marker){
  30. System.out.println("f3(" + marker + ")");
  31. }
  32. static Bowl bowl5 = new Bowl(5);
  33. }
  34.  
  35. public class test{
  36. public static void main(String args[]){
  37. System.out.println("creating new cupboard() in main");
  38. new Cupboard();
  39. System.out.println("creating new cupboard() in main");
  40. new Cupboard();
  41. table.f2(1);
  42. cupboard.f3(1);
  43. }
  44. static Table table = new Table();
  45. static Cupboard cupboard = new Cupboard();
  46. }
  1. Bowl(1)
  2. Bowl(2)
  3. Table()
  4. f1(1)
  5. Bowl(4)
  6. Bowl(5)
  7. Bowl(3)
  8. Cupborad()
  9. f1(2)
  10. creating new cupboard() in main
  11. Bowl(3)
  12. Cupborad()
  13. f1(2)
  14. creating new cupboard() in main
  15. Bowl(3)
  16. Cupborad()
  17. f1(2)
  18. f2(1)
  19. f3(1)

  从输出可以看出来当有静态成员变量存在时,初始化的顺序是,先对静态的成员变量进行顺序初始化,再对非静态的成员变量进行顺序初始化,需要注意的是,由于静态变量是一块共享的内存区域,所以某个类的静态变量只会被初始化一次。

  书上总结了创建一个对象的编译器的详细过程(假设类为dog):

  (1)由于构造器是静态方法,当首次创建类型为Dog的对象时,或者首次访问静态域时,java解释器首先会查找类路径,定位dog.class文件。

  (2)首次加载dog.class,然后执行一次静态初始化的动作。

  (3)用new dog()创建对象时,先在堆上给dog分配足够的内存空间。

  (4)将这块存储空间清零,会将dog中的所有成员变量变为默认值。

  (5)执行出现于字段定义处的初始化动作。

  (6)执行构造器。

Chapter5_初始化与清理_构造器初始化的更多相关文章

  1. Chapter5_初始化与清理_数组初始化与可变参数列表

    一.数组初始化 数组是相同类型的,用一个标识符名称封装到一起的一个对象序列或基本类型数据序列.编译器是不允许指定数组的长度的,当使用语句int[] a时,拥有的只是一个符号名,即一个数组的引用,并不拥 ...

  2. Chapter5_初始化与清理_成员初始化

    在java中,成员初始化在使用之前应该都要保证已经完成初始化.对于在方法体中的局部变量,如果没有使用指定初始化的方法对成员变量进行初始化,编译器会提示一个错误.而对于类的数据成员,编译器会对这些成员赋 ...

  3. Chapter5_初始化与清理_用构造器初始化

    接下来进入第五章,java中初始化和清理的问题,这是两个涉及安全的重要命题.初始化的功能主要是为库中的构件(或者说类中的域)初始化一些值,清理的功能主要是清除程序中不再被需要的元素,防止资源过分被垃圾 ...

  4. 图解 & 深入浅出Java初始化与清理:构造器必知必会

    Writer      :BYSocket(泥沙砖瓦浆木匠) 微         博:BYSocket 豆         瓣:BYSocket FaceBook:BYSocket Twitter   ...

  5. Chapter5_初始化与清理_方法重载

    方法重载是java中编译器在方法调用时采用的一个重要机制.起初方法重载的初衷是方便构造器的调用,比如对于一个类,可以实现用不同的方法来初始化它,又由于构造器的名称都是一样的,所以必须使用到方法重载的机 ...

  6. java编程思想第五章初始化与清理

    5.1使用构造器确保初始化: 构造器与一般方法一样,但是没有返回值,且其方法名与类名完全相同. 不接受任何参数的构造器成为默认构造器,也叫无参构造器. 5.2 方法重载: 为什么会有方法重载? 构造器 ...

  7. 20190816 On Java8 第六章 初始化和清理

    第六章 初始化和清理 利用构造器保证初始化 在 Java 中,类的设计者通过构造器保证每个对象的初始化. 构造器名称与类名相同. 在 Java 中,对象的创建与初始化是统一的概念,二者不可分割. 方法 ...

  8. 《 Java 编程思想》CH05 初始化与清理

    < Java 编程思想>CH05 初始化与清理 用构造器确保初始化 在 Java 中,通过提供构造器,类的设计者可确保每个对象都会得到初始化.Java 会保证初始化的进行.构造器采用与类相 ...

  9. [THINKING IN JAVA]初始化和清理

    4.5初始化和清理 5.1 构造器初始化 无参:如果一个类没有构造器,那么会有一个默认的无参构造器,并且只能通过无参构造器初始化对象: 带参:传入参数初始化成员变量或者其它初始化操作需要的参数,如果类 ...

随机推荐

  1. ie8兼容性总结

    DOCTYPE 首先需要确保你的HTML页面开始部分要有DOCTYPE声明.DOCTYPE告诉浏览器使用什么样的HTML或XHTML规范来解析HTML文档,具体会影响: 对标记.attributes ...

  2. fdisk 分区及 swap

    使用虚拟机创建挂载点 一,创建 windows 硬盘        创建  

  3. 序列号多个input输入demo

    <input class="inputs" type="text" maxlength="4" /> <input cla ...

  4. JQ删除数组中的某个对象

    ---恢复内容开始--- var pros = []; 全局变量function doSearchSal(){ var param = {}; var searchSal=$.trim($(" ...

  5. 监测c3动画过渡完成的事件

    监测css3动画完成的事件 transitionend 用法: let element = document.getElementById("slidingMenu"); elem ...

  6. 39_redux_counter应用_redux版本

    一.下载 要想使用redux,首先要下载它 npm install --save redux 二.核心API 1.createStore() 作用:创建包含指定reducer的store对象 编码:i ...

  7. [Tools] 一种调试 Android App 接口的方式 (Fiddler/Wireshark)

    要求:Windows电脑与手机在同一局域网内(Wifi). [ Fiddler 设置代理 ] 下载地址:https://www.telerik.com/download/fiddler 依次 Tool ...

  8. Linux内核d_path函数应用的经验总结

    问题背景 一个内核模块中,需要通过d_path接口获取文件的路径,然后与目标文件白名单做匹配. 在生产环境中,获取的文件是存在的,但是与文件白名单中的文件总是匹配失败. 问题定位: 通过打印d_pat ...

  9. Mysql 存储过程批量建表

    CREATE DEFINER=`root`@`%` PROCEDURE `createTables`() begin declare i int; declare suffix varchar(20) ...

  10. scrapy 之自定义命令运行所有爬虫文件

    1.在spider文件夹同级目录创建commands python包 2.在包下创建command.py文件 3.从scrapy.commands包下引入ScrapyCommand 4.创建一个类,继 ...