读 《Thinking in Java》 笔记 (1)

请看下面这个例子 (结构简单,但各种创建可能会有点晕,你可以通过它推出正确的打印顺序,就基本过关了,这里还包含了静态成员)

package study;class Bowl {public Bowl(int marker) {System.out.println("Bowl(" + marker + ")");}void f(int marker) {System.out.println("f(" + marker + ")");}
}class Table {static Bowl b1 = new Bowl(1);public Table() {System.out.println("Table()");b2.f(1);}void f2(int marker) {System.out.println("f2(" + marker + ")");}static Bowl b2 = new Bowl(2);
}class Cupboard {Bowl b3 = new Bowl(3);static Bowl b4 = new Bowl(4);public Cupboard() {System.out.println("Cupboard()");b4.f(2);}void f3(int marker) {System.out.println("f3(" + marker +")");}static Bowl b5 = new Bowl(5);
}public class S {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();t2.f2(1);t3.f3(1);}static Table t2 = new Table();static Cupboard t3 = new Cupboard();}

输出结果:

static初始化只有在必要的时候才会进行。如果不创建一个Table对象,而且永远都不引用 Table.b1或Table.b2,那么static    Bowl  b1和b2永远都不会创建。然而,只有在创建了第一个Table 对象之后(或者发生了第一次static访问),它们才会创建。在那以后,static对象不会重新初始化。初始化的顺序是首先static(如果它们尚未由前一次对象创建过程初始化),接着是非 static对象。大家可从输出结果中找到相应的证据。

总结一下对象的创建过程(后续随着学习的深入还会扩展)

在这里有必要总结一下对象的创建过程。请考虑一个名为Dog的类:
(1)类型为Dog的一个对象首次创建时,或者Dog类的static方法/static字段首次访问时,Java解释器必须找到Dog.class(在事先设好的类路径里搜索)。
(2)找到Dog.class后(它会创建一个Class对象,这将在后面提及),它的所有static初始化模块 都会运行。因此,static初始化仅发生一次——在Class对象首次载入的时候。
(3)创建一个new Dog()时,Dog对象的构建进程首先会在内存堆(Heap)里为一个Dog对象分 配足够多的存储空间。
(4)这种存储空间会清为零,将Dog中的所有基本类型设为它们的默认值(零用于数字,以及 boolean和char的等价设定)。
(5)进行字段定义时发生的所有初始化都会执行。
(6)执行构建器(存在更多细节)。

读 Thinking in Java 笔记(1)相关推荐

  1. 读thinking in java笔记(四):初始化

        随着计算革命的发展,"不安全"的编程方式已逐渐成为编程代价高昂的主因之一.     初始化和清理(cleanup)正是涉及安全的两个问题.许多C程序的错误都源于程序员忘记初 ...

  2. 10.6-全栈Java笔记:常见流详解(四)

    上节我们讲到「Java中常用流:数据流和对象流」,本节我们学习文件字符流和文件缓冲流~ 文件字符流 前面介绍的文件字节流可以处理所有的文件,但是字节流不能很好的处理Unicode字符,经常会出现&qu ...

  3. 【Java笔记+踩坑】SpringBoot基础3——开发。热部署+配置高级+整合NoSQL/缓存/任务/邮件/监控

      导航: [黑马Java笔记+踩坑汇总]JavaSE+JavaWeb+SSM+SpringBoot+瑞吉外卖+SpringCloud/SpringCloudAlibaba+黑马旅游+谷粒商城 目录 ...

  4. java笔记之redis-缓存问题

    java笔记之redis-缓存问题 介绍: ​ redis虽然性能极高,但实际开发中也会有各种问题: ​ ①为保证数据库和缓存双方一致性 ​ ②缓存穿透 ​ ③缓存雪崩 ​ ④缓存击穿 转载: htt ...

  5. Java笔记(学习中。。)

    Java笔记 eclipse的使用 常用的dos指令 预备知识 基本语法 变量 关于字符型 关于String 进制转换 运算符 流程控制 数组 数组的内存解析: 数组的Arrays工具类 面向对象 对 ...

  6. Java笔记-Java日常笔记-Java核心语言-史上最全Java笔记-Java烂笔头-实时更新(~v~)

    阿一的日常Java笔记,实时更新,有什么问题可以留言交流一下,大家一起共同进步!!! 1.Java基础 1.1.基本语法 1.1.1.关键字 ​ 定义:被java赋予特殊含义的字符串(单词): ​ 关 ...

  7. Java笔记整理五(Iterator接口,泛型,常见数据结构(栈,队列,数组,链表,红黑树,集合),jdk新特性,异常,多线程,Lambda表达式)

    Java笔记整理五 1.1Iterator接口 Collection接口与Map接口主要用于存储元素,而Iterator主要用于迭代访问(即遍历)Collection中的元素,因此Iterator对象 ...

  8. 11.3-全栈Java笔记:线程的生命周期

    一个线程对象在它的生命周期内,需要经历5个状态. 新生状态(New) 用new关键字建立一个线程对象后,该线程对象就处于新生状态.处于新生状态的线程有自己的内存空间,通过调用start方法进入就绪状态 ...

  9. 10.4-全栈Java笔记:常用流详解(二)

    上节我们讲到「Java中常用流:文件字节流和字节数组流」,本节我们继续走起~  缓冲流 BufferedInputStream和BufferedOutputStream这两个流是处理流,通过内部缓存数 ...

最新文章

  1. linux之父密码,Linux之父十大名言
  2. layui时间怎么设置年月日时分秒_layui-laydate时间日历控件使用方法详解
  3. 教程:从FLASH过渡到SILVERLIGHT.(实例+源码)
  4. php如何实现根据地区内筛选,PHP区块查询实现方法分析
  5. 一款jquery实现的整屏切换特效
  6. js文件处理File
  7. 大规模搜索+预训练,百度是如何落地的?
  8. javascript 询问_JavaScript解释引擎
  9. C# 未能加载文件或程序集“ Newtonsoft.Json” Json格式错误
  10. P2342 叠积木 并查集
  11. 拉格朗日、牛顿、拟合的应用
  12. 生命密码是几适合学计算机,数字生命密码是什么?
  13. 关于计算机的英语手抄报简单,英语手抄报简单又好看图片
  14. Excel数值函数(3):对“自动筛选”的结果求和、平均值、极值等
  15. linux vnc登陆,vnc登陆,4个步骤教你vnc登陆Linux
  16. java 父委托机制优点_Java虚拟机父类委托机制设计的优点
  17. 对SCI期刊的初步了解
  18. 《数学建模与数学实验》第5版 数据的统计描述 习题8.7
  19. mondrian mysql 实例_MONDRIAN支持的常用mysql函数
  20. 认证密钥协商(Authentication key agreement)的安全目标

热门文章

  1. 计算机打不开guest用户,guest账户打不开 浅析win10系统guest账户打不开的解决方法...
  2. cannot be referenced from a static context 报错
  3. Android高级工程师面试实战,您会挂么?
  4. [goa]golang微服务框架学习--安装使用
  5. 迷宫游戏c语言实验报告,c++迷宫游戏实验报告.doc
  6. Ps笔刷:划痕噪音效果
  7. 特征选择 - SelectFromModel(根据重要性权重选择特征)
  8. 【C题】如果已知英制长度的英尺f oot和英寸inch的值,那么对应的米 是(foot + inch/12) x 0.3048。现在,如果用户输入的是厘 米数,那么对应英制长度的英尺和英寸是多少呢?
  9. git --- git tag用法
  10. 摆脱重复操作,你值得拥有的自动化工具Automa|CSDN创作打卡