初始化和清理

构造器确保初始化

类的设计者应确保每个对象都能得到初始化。
构造器与类名相同。
在Java中“创建”一个对象的同时必须将其“初始化”。

方法重载

用在构造器上,改变传入参数的类型和数目以达到多种方式“构建”对象。(以返回值来区分重载是行不通的!)

1. 涉及基本类型的重载

如果传入的数据类型“小于”方法中声明的形式参数类型,实际的参数类型会得到提升。char型略有不同,如果无法找到恰好接受char参数的方法,就会转为int型。如果传入的数据类型“大于”方法中声明的实际参数类型,就必须做强制的类型转换,不然编译器会报错。(“窄化转换”可能会丢失信息!)

2. 缺省构造器(无参构造器)

你一旦写了一个构造器编译器就不会提供缺省构造器,不然编译器会帮你自动加一个无参构造器。

3. this 关键字

this 关键字只能在方法的内部使用,表示对“调用方法的那个对象”的引用。但是在方法的内部调用同一个类的另一个方法不必使用 this
实际上只有当需要明确指出对当前对象的引用时,才需要使用 this 关键字。例如,当需要返回对当前对象的引用时,就常常写 return this;以达到在一条语句里对同一个对象执行多次操作。

3.1 在构造器中使用 this 调用另一个构造器(避免重复代码)

如果在构造器中使用 this(参数表列),这将产生对符合此参数表列的某个构造器的明确调用。但是 this 不能调用两个构造器,且必须将构造器的调用置于最起始处,否则编译器会报错。

3.2 static方法

用途:在没有创建任何对象的前提下,通过类本身来调用 static方法
static方法的内部不能调用非静态方法,但在非静态方法内部却可以调用static方法

4. 数组的初始化

数组是引用数据类型!

成员初始化

1. 自动初始化

Java(在调用构造器之前)自动初始化保证类的每一个基本数据类型都会得到初值0,以及对象引用得到null值(尽管你并未将它们初始化)。

2. 指定初始化值

自动初始化时不再是0和null

3. 构造器初始化

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

3.1 自动初始化的顺序

变量定义的先后顺序决定了自动初始化的顺序,即使变量散落在方法定义之间,它们也会在任何方法(包括构造器)被调用之前得到初始化。

3.2 static数据、块初始化

修饰的数据、块在类被初次加载时(对象还未被创建)得到初始化或执行,且只在类存在的时间内只执行一次。

3.3 非静态实例初始化

类中的 { code… } 与static修饰的代码块一样都会在类加载执行

清理:终结处理和垃圾回收

Java的垃圾回收机器只知道释放经由new分配的内存,对于那些非new创建的对象需要在类中自己定义一个finalize()方法在垃圾回收时刻来释放。

工作原理
一旦垃圾回收器准备好释放对象占用的内存,将首先调用 finalize()方法,并且在下一次垃圾回收动作发生时才会真正回收对象占用的内存。

明确两点
(1)对象可能不被垃圾回收
(2)垃圾回收不等于“析构”
在不需要某个对象之前,如果必须执行某些动作,那么必须自己手动创建一个普通方法来调用执行。
(3)垃圾回收只与内存有关
无论对象是如何创建的(譬如在对象中包含其他对象),垃圾回收器都会负责释放对象占据的所有内存资源。finalize()方法只有在通过某种创建对象方式以外的方式为对象分配了内存空间才会被需求。这种以外的方式是在Java中调用非Java代码的方式,例如在非Java代码中调用了C的 malloc()函数系列来分配存储空间,而且除非调用 free()函数,存储空间得不到释放,所以要在 finalize()方法中调用 free()
要清理一个对象,用户必须在需要清理的时刻明确调用执行清理的恰当的Java方法,而不能指望finalize()

finalize()的用途
当对某个对象不再感兴趣,也就是它可以被清理了,这时候这个对象会处于某种状态,使它占用的内存可以被安全的释放。而finalize()价值在于可以用来发现对象中没有被适当清理的部分。System . gc()用来强制进行终结动作(加速调试过程)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值