读 Thinking in Java 笔记(1)

2023-05-16

读 《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)执行构建器(存在更多细节)。 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

读 Thinking in Java 笔记(1) 的相关文章

随机推荐

  • 202012-5 星际旅行 (线段树模板60分)记录一下

    include lt bits stdc 43 43 h gt using namespace std typedef long long ll const int maxn 61 1e5 43 5 const ll MOD 61 1e9
  • 联机象棋(1)

    联机象棋 xff08 1 xff09 需求架构与开发技术主要设计与实现1 棋盘 棋子布局2 选棋 下棋3 人人对战匹配4 判断是否被将5 通信模块6 其他如声音效果等提升用户体验7 人机对战 尚未实现 8 最终实现效果图 需求 登录 注册
  • AbstractQueuedSynchronizer源码阅读(1)(AQS JDK1.8)

    AbstractQueuedSynchronizer 前言AbstractQueuedSynchronizer xff08 1 xff09 JDK 1 8 用途主要源码分析Node内部类ConditionObject类重要方法 主要的属性及
  • ReentrantLock源码阅读(1)(JDK1.8)

    ReentrantLock 前言ReentrantLock JDK 1 8 实现了Lock接口Sync类NonfairSync类FairSync类重要属性和方法 总结 前言 最近在使用Java 并发包时遇到一些问题 xff0c 感觉对于其还
  • SpringBoot整合Kafka控制消费启停遇到的问题记录(@KafkaListener注解使用)

    最近在做一个SpringBoot整合Kafka的一个项目 xff0c 需要控制Kafka客户端消费数据的停止与启动 xff0c 遇到一个问题 xff0c 排查下来感觉对自己有一定帮助 xff0c 趁此记录一下 配置KafkaListener
  • 我的第一次实质性开源贡献——Apache IoTDB

    前言 虽然之前也在Github上尝试提过一些PR 但都是一些doc typo等类型的入门实践 真正算得上有一定实质性工作 xff0c 要数最近在Apache IoTDB上提交的一个功能PR 如果大家对开源感兴趣的话 xff0c 可以看我的一
  • 开源相关知识介绍

    以下是自己网上搜集的一些有关开源的一些背景知识进行分享 xff0c 欢迎对开源感兴趣的同学可以阅读 xff0c 跟我一起走进开源 拥抱开源 目录 一 开源项目的演进 二 开源项目的成功案例 Apache Linux Mozilla Ubun
  • python数据结构算法DAY3| 堆排序

    目录 前言 1 什么是堆排序 xff1f 堆的向下调整性质 2 堆排序思路 3 堆排序代码 python中堆排序的内置模块 4 堆排序时间复杂度 5 堆排序解决topk问题 前言 堆排序是基于完全二叉树 xff0c 堆是一种特殊的完全二叉树
  • Apache IoTDB’s UDF源码分析(1)

    目录 前言 命令行注册UDF函数 Create Function xxx as 34 全限定类名 34 语法分析 生成物理计划 执行物理计划进行函数注册 Select带有UDF函数的查询 前言 继上个月开始了Apache IoTDB的源码贡
  • 新手入门贡献Apache IoTDB

    名词解释 Issue 开源社区的一个任务的统称 xff0c 通常会有一个Issue 列表 xff0c 用于表示各种任务 xff0c 比如功能Issue Bug Issue Improvement Issue等 PR Pull Request
  • Apache IoTDB介绍

    什么是时序数据库 时序数据库 为万物互联插上一双翅膀 有态度的HBase Spark BigData 总体介绍 Apache IoTDB 始于清华大学软件学院 xff0c 是一款时序数据库 主要使用场景是在物联网相关行业 xff0c 如 x
  • 以回溯的思想求解0-1背包问题

    以回溯法的思想求解0 1背包问题 目录 介绍 求解 介绍 0 1背包问题 问题描述 给定n种物品和一背包 物品i的重量是wi xff0c 其价值为pi xff0c 背包的容量为C 问应如何选择装入背包的物品 xff0c 使得装入背包中物品的
  • Qt中QMessageBox中的几种常见用法归纳

    Qt中QMessageBox中的几种常见用法归纳 最简单的弹出一个提示框 QMessageBox question this 34 Title 34 34 Content 34 QMessageBox warning this 34 Tit
  • Java Web学习里遇到一些问题

    Java Web学习里遇到一些问题 在使用Java Bean技术时 xff0c 新建一个Bean类时 xff0c 直接放到src里 xff0c 在Intellij IDEA里会解析不了 xff0c 要在src里建个包将其放到包里 xff0c
  • python里类声明里一个比较坑的错误

    python里类声明里一个比较坑的错误 正确的 import pygame from pygame sprite import Sprite class Alien Sprite 34 34 34 初始化外星人并设置其起始位置 34 34
  • MySQL存储时间出现不一致的问题

    用Java在获取了系统时间后 xff0c 存入MySQL数据库时 xff0c 当时间的类型为datetime或Timestamp时发现数据库的存储与本地时间不一致 很大原因是 xff0c MySQL设置的时区与你本地时区不一致造成的 xff
  • 在运用Putty连接远程服务器时遇到的坑:server unexpectedly closed network

    在运用Putty连接远程服务器时遇到的坑 xff1a server unexpectedly closed network 如果是在Putty需输入那个密码的 xff0c 那个密码是默认不显示 xff0c 你输完后一定要记得敲回车 xff0
  • Java中的==与equals()的区别(1)

    Java中的 61 61 与equals 的区别 xff08 1 xff09 package study public class Note1 public static void main String args TODO Auto ge
  • cookie,session和token详解和区别

    目录 前言 1 cookie和session是为了解决什么问题产生的 xff1f 2 什么是会话技术 xff1f 3 cookie详解 Cookie的表示 Cookie的组成 Cookie的HTTP传输 Cookie的生命周期 cookie
  • 读 Thinking in Java 笔记(1)

    读 Thinking in Java 笔记 xff08 1 xff09 请看下面这个例子 xff08 结构简单 xff0c 但各种创建可能会有点晕 xff0c 你可以通过它推出正确的打印顺序 xff0c 就基本过关了 xff0c 这里还包含