您的位置:首页 > 编程语言 > Java开发

《Java 编程思想》--第四章:控制执行流程,第五章:初始化与清理

2013-04-25 16:00 477 查看
break和continue关键词通常只中断当前循环,但若随同标签一起使用,他们就会中断循环,直到标签所在的地方
不接受任何参数的构造器叫做默认构造器,java文档中通常使用术语无参构造器
java通过参数类型列表来识别重载的方法
java中如果已经定义了一个构造器,无论是否有参数,编译器就不会帮你自动创建默认构造器
this关键字只能在方法内部使用,表示对调用方法的那个对象的引用
尽管可以使用this调用一个构造器,但却不能调用两个,此外,必须将构造器置于最起始处,否则编译器会报错
static方法的内容部不能调用非静态方法
java允许在类中定义一个名为finalize()方法,它的工作原理是这样的,一旦垃圾回收期准备好释放对象占用的存储空间,将首先调用finalize方法,并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存

对象可能不被垃圾回收
垃圾回收并不等于析构
垃圾回收只与内存有关

必须自己编写方法,实现清理
引用计数:一种简单但速度很慢的垃圾回收技术。每个对象都有一个引用计数器,当有引用连接至对象时,引用计数加1.当引用离开作用域或被置于null时,引用计数减1.虽然管理引用计数的开销不大,但这项开销在整个程序生命周期中将持续发生,垃圾回收期会在含有全部对象的列表上遍历,当发现某个对象的引用计数为0时,就释放其占用的空间。这种方法有个缺陷,如果对象之间存在循环引用,可能出现”对象应该被回收,但引用计数却不为零“的情况
在一些更快的模式中,使用的思想是:对任何活的对象,一定内最终追溯到其存活在堆栈或静态存储区之中的引用。这个引用链条可能会穿过数个对象层次。由此,如果从堆栈和静态存储区开始,遍历所有引用,就能找到所有活的对象。对于发现的每个引用,必须追踪它所引用的对象,然后是此对象包含的所有引用,如此反复进行,直到根源于堆栈和静态存储区的引用所形成的的网络全部被访问位置。
java虚拟机采用一种自适应的垃圾回收技术,置于如何处理找到的存活对象,取决于不同的java虚拟机实现,有一种做法名为停止-复制,这意味着先暂停程序的运行,然后将所有存活的对象从当前堆复制到另一个堆,没有被复制的全部都是垃圾。当对象被复制到新堆时,他们是一个挨着一个的,所以新堆保持着紧凑排列
对于这种复制式回收期而言效率会降低,首先得有两个堆,然后在这两个分离的堆之间来回复制,从而得维护比实际多一倍的空间,某些java虚拟机对此问题的处理方式是,按需从堆中分配几块较大的内存,复制动作发生在这些大块内存之间。其次问题在于复制,程序进入稳定状态后可能只会产生少量垃圾,甚至没有垃圾,尽管如此,复制时回收期仍然会将所有内存从一处复制到另一处,这很浪费。一些虚拟机在没有新垃圾产生时,会转换到另一种工作模式,称为标记-清扫
标记-清扫的思路:从堆栈和静态存储区出发,遍历所有的引用,进而找出所有存活的对象,每当他找到一个存活对象,就会给对象一个标记,整个过程中不会回收任何对象,只有全部标记工作完成后,清理工作才会开始。没有标记的对象将被释放,不会发生任何复制活动,所以剩下的堆空间是不连续的,需要重新整理
在这里讨论的java虚拟机中,内存分配以较大的块为单位
如果一个域是静态的基本类型域,且也没有对他进行初始化,那么他就会获得基本类型的标准初值,如果他是一个引用,则会获得null
初始化顺序是先静态对象,而后是非静态的对象
显式的静态初始化:

public class Spoon{
staitc int i;
static{
i=47
}
}

java中有枚举类型,如:

public enum Spiciness{
NOT,MILD,MEDIUM,HOT,FLAMING
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: