初始化与清理

Posted xxgbl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了初始化与清理相关的知识,希望对你有一定的参考价值。

用构造器确保初始化

在Java中,通过提供构造器,类的设计者可确保每个对象都会得到初始化。

方法重载

方法名,返回值都相同,参数列表不同的类称为重载。

区分重载方法

Java是如何区分方法名都相同的方法的?其实规则很简单:每一个重载的方法都必须有一个独一无二的参数列表。

涉及基本类型的重载

如果传入的数据类型小于方法中声明的参数类型。那么传入的数据类型会被提升。
char类型不同,如果找不到能恰好接受char参数的方法,会把char直接提升至int型。
如果传入的数据类型大于方法中声明的参数类型。必须得实行强制转换。否则编译器会报错。

this关键字

如果一个类有两个对象a,b。类中只有一个peel()方法。编译器是如何知道到底是对象a调用了这个方法,还是b调用了这个方法呢?
其实编译器做了一些幕后工作。它暗自把所操作对象的引用当作第一个参数传递给了peel(),就像这样peel(a,1),peel(b,2).
假设你想在方法的内部得到当前对象的引用。由于这个引用是由编译器自己传入的,所以没有标识符可用。但是,为此有专门设计的关键字,那就是this。
this只能在方法内部使用。表示当前调用这个方法的对象的引用。如果在方法内部调用同一个类的其他方法,就不用使用this,直接调用即可。

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

Java有垃圾回收器负责回收无用对象占据的内存资源。但也有特殊情况。假定你的对象(并非使用new)获得了一块“特殊”的内存区域。由于垃圾回收器只能释放哪些经由new创建的对象。所以它不知道如何释放这块“特殊内存”。
为了解决这个问题,java允许在类中定义finalize()方法。它的工作原理假定是这样的:一旦垃圾回收器准备好释放对象所占用的内存,将首先调用对象的finalize()方法。并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存。

你必须自己实施清理

无论是垃圾回收还是终结,都不保证一定会发生。如果Java虚拟机并未面临内存耗尽的情形,他是不会浪费时间去执行垃圾回收以恢复内存的。所以,如果希望进行除释放存储空间之外的清理工作。还是得明确调用某个恰当的Java方法。

终结条件

finalize()有一个有趣的用法,它并不依赖与每次都要对finalize()进行调用,那就是对象终结条件的验证。
当一个对象可以被清理了,那么它应该处于某种状态,使它占用的内存可以被安全的释放。

垃圾回收器如何工作

引用计数是一种简单但速度很慢的垃圾回收技术。每个对象都含有一个引用计数器,当有引用指向该对象时,引用计数+1,当引用计数为0时,就释放其占用空间。此法有个缺陷,如果对象之间存在循环引用,就可能会出现(“对象应该被回收,但计数器不为0”)的情况。对垃圾回收器而言,定位这样的交互自引用的对象组所需的工作量极大。
在一些更快的模式中,它们依据的思想是:对于任何活着的对象,一定能最终追溯到其存活在堆栈或静态存储去之中的引用。由此,遍历所有引用就能找到所有活着的对象。
在这种方式下Java采用一种自适应的垃圾回收技术。对于如何找到所有活着的对象,不同虚拟机有不同的实现。
有一种做法名为“停止-复制”。先暂停程序,然后将所有活着的对象从当前堆复制到另一个新堆里。没有复制的对象都是垃圾,当被复制到新堆的时候,它们是一个挨着一个的。
程序进入稳定状态之后,可能会产生少量垃圾,甚至没有垃圾。如果还是用“停止-复制”的方法进行垃圾回收,会很浪费。(将所有内存自一处复制到另一处)。为了避免这种情况,Java虚拟机会进行检查,要是没有新的垃圾产生,就会进入到另一种工作模式:“标记-清扫”。思想是:遍历所有引用,找到所有活着的对象。并且分别为它们投一个标记。这个过程不会释放任何对象。只有全部标记工作完成的时候,清理才会进行。清理过程中,没有标记的对象会被释放。
自适应技术:java虚拟机会进行监视,如果所有对象都很稳定,垃圾回收器的效率降低的话,就切换到“标记-清扫“方式。同样Java虚拟机会跟踪”标记-清扫“效果,要是堆空间出现很多内存碎片。就会切换到”停止复制“方式对内存进行紧凑排序。

成员初始化

Java尽力保证,所有变量在使用前都能得到恰当的初始化。类中基本类型的数据成员会被保证赋予一个初始值。在类中定义了一个对象引用且不将其初始化的话此引用会被赋予null。

指定初始化和构造器初始化

如果想为某个变量赋初值,该怎么做呢?
1.在定义类成员变量的地方直接指定初始值。
2.构造器初始化。

初始化顺序

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

枚举类型

当你创建enum时,编译器会自动添加伊西俄有用的特性。它会创建toString()方法,以便你能方便的显示某个enum的实例名字。编译器还会创建ordinal()方法。用来表示某个特定enum常量的声明顺序。以及static values()方法。用来按照enum常量的声明顺序创建由这些值构成的数组。















以上是关于初始化与清理的主要内容,如果未能解决你的问题,请参考以下文章

Java初始化与清理

初始化与清理

5初始化与清理

《java编程思想》 初始化与清理

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

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