再读thinking in java -- 第五章 初始化与清理

本文探讨了Java中构造器的使用方式及其限制,包括如何通过this调用不同构造器及static方法的特点。同时深入解析了Java垃圾回收机制,如对象的生命周期、内存管理以及finalize方法的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当类中有多个构造器,在其中一个构造器内可用this()调用其他的构造器,但是只能调用一个,且要放到构造器内部开始处。

除构造器外,编译器禁止其他方法调用构造器(new除外)

static方法就是没有this的方法。static方法内部不能调用非静态方法(反过来可以)。

垃圾回收器只能释放经由new分配的内存。对于非new出来的对象获得的“特殊”内存区域它不知道如何释放。为解决这种情况,java允许类中定义名为finalize的方法。

finalize()的原理可被认为:一旦GC准备好释放对象占用的存储空间,将首先调用finalize方法,并在下一次垃圾回收发生时,才将回收对象占用的内存。

java垃圾回收:1、对象可能不被垃圾回收;    2、垃圾回收不等于析构;    3、垃圾回收只与内存有关。使用GC的唯一原因是回收程序不再使用内存。无论对象如何创建,GC都会负责释放对象占据的内存。

具体可以参考该博客: http://blog.youkuaiyun.com/u010746364/article/details/51555200

该博客中对于第二个结论的程序,若在  a.b = new B(); 后加上 B b= a.b;    则释放a,b的内存也不会释放。这就意味着只要对象有引用存在,对象内存就不会被GC回收。具体的解释需等我看完jvm的内容才能给出。

在编程中应该避免使用finalize,原因:    http://blog.youkuaiyun.com/wuhenzhangxing/article/details/45559999

java不允许创建局部对象,必须使用new创建对象。

无论是垃圾回收或者终结,都不一定会发生。若jvm并未面临内存耗尽的情形,它便不会去执行垃圾回收以恢复内存。

System.gc()用于强制进行终结动作。p89的程序不太明白

GC对于提高对象创建速度有明显的作用。

无法阻止自动初始化的进行,它将在构造器被调整之前发生。

类内部变量定义先后顺序决定了初始化顺序,会在方法(包括构造器)被调用之前得到初始化。

无论创建多少对象,静态数据只占一份存储区域。static不能用于局部变量,构造器实际上是静态方法。静态初始化只在class对象首次加载时进行一次。  

对象创建过程(以dog类为例):

1、首次创建dog对象,java解释器找出类路径,找到dog.class文件;

2、载入dog.class文件,进行静态初始化;  

3、new dog()创建对象时,在堆上为对象分配足够的存储空间;

4、当该空间清零,意味将基本数据类型设置为默认值,引用设为null;

5、执行字段定义出的初始化动作;

6、执行构造器。

若类未加载,调用类的静态成员,将会对类的其他静态成员也进行调用(p97程序)

程序中的块相当于变量

数组越界是运行时错误,即异常。

toString方法默认打印类名加上对象地址。

可变参数可以不显示编写数组语法    public void function(Object ... args)中输入参数可以是几个对象,不用在一个数组中。对于可变参数,可以不传值进入方法。可变参数不依赖自动包装,传的是基本类型,其类型基本类型。

枚举类型关键字:enum    创建enum编译器自动添加一些特性:eg. toString方法;ordinal方法,特定常量的声明顺序;static value方法,按声明顺序产生由常量构成的数组。    enum相当于类

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值