《java编程思想》:第五章,初始化与清理

时间:2022-10-02 19:41:26

知识点整理:

1.从概念上讲,‘初始化’与‘创建’是彼此独立的,但是在Java中,两者被捆绑在一起,不可分离。

2.区分重载的方法:每个重载的方法都有一个独一无二的参数类型列表。 甚至参数顺序的不同也可以区分两个方法,但是不建议这样做,这样会使代码难以维护。

  注意:不可以通过返回值区别重载,原因是有时需要方法的返回值,但是有时不需要,例如,两个方法,piblic String func(){sysout(“xxxx”)}与public void func(){sysout(“xxxx”)},当只想输出xxxx时,直接一句 func()足矣,但是此时编译器便不知道具体调用的是哪个方法。

3.如果没有定义构造器,那么编译器会自动创建一个无参的构造器,但是如果已经定义了构造器(无论是否有参数),构造器都不会再创建默认构造器。

4.可以用this关键词调用一个构造器,但是只能调用一个,且必须将构造器置于最起始处,否则编译器报错。

5.清理

  垃圾回收器只知道释放经由new分配的内存,如果一个对象并非使用new获得了一块特殊的内存区域,回收器便无法释放该对象,所以,java允许在类中定义名为finalize()的方法。

  关于垃圾回收,铭记三点:1.对象可能不被垃圾回收;2.垃圾回收不等同于“析构”。;3.垃圾回收只与内存有关。

  无论是“垃圾回收”还是“终结”,都不保证一定会发生,如果JVM并未面临内存耗尽的情况,是不会浪费时间去执行垃圾回收恢复内存的。

6.垃圾回收器工作原理

  现在的JVM一般采用一种“自适应”的垃圾回收技术,即“停止-复制”与“标记-清扫”的自动切换。

  “停止-复制”:先暂停程序的运行,然后将所有存活的对象从当前堆复制到另一个堆,没有被复制的全都是垃圾。对象被复制到新堆后是紧凑排列的然后就可以直接分配新空间了。此模式存在的问题:首先,需要两个堆,然后在两个独立的堆之间来回倒腾,从而得维护比实际多一倍的空间。某些jvm的处理方式是按需从堆中分配几块比较大的内存,复制动作发生在这些块之间;其次,程序稳定后,只会产生很少的垃圾,甚至没有垃圾,但是复制动作依然在发生,很浪费,没有必要。此时,便引入了一种新的模式“标记-清扫”。

  “标记-清扫”:此时遍历所有的引用,只为存活的对象做一个标记,当完成全部标记工作后,开始清理工作,此过程很慢,且清理后的堆空间是不连续的,需要重新整理对象才能得到连续的空间。