其他分享
首页 > 其他分享> > TIJ-4Edition-初始化与清理

TIJ-4Edition-初始化与清理

作者:互联网

1、构造器保证初始化

  没有定义构造器时,编译器会生成一个默认构造器(无参构造器);但是,当自己定义了有参构造器时,编译器不会生成默认构造器,调用new时,必须传入匹配的参数。

2、方法重载

  每个重载的方法都具有独一无二的参数列表(类型、顺序)。

3、this关键字

  调用对象方法时,编译器把对象的引用this作为第一个参数传入了方法内部(除了static方法),并在调用类方法时自动补上this。

  (python类方法的参数列表的第一个参数也是当前对象的引用,需要显示定义,但调用时由编译器传入)

4、static关键字

  static修饰的字段、方法属于类而不属于对象,因此,其内部没有this引用。除非显示的传入对象引用,不然无法static方法内部不能调用非静态方法。

5、finalize()方法

  一旦GC打算回收对象占用的空间,将首先会调用对象的finalize()方法(此特性可以用来验证对象是否真正终结)。

  能否将finalize()当析构函数使用? 不能!

    1、GC会回收无用对象,但是其回收的时机是不确定的。

    2、垃圾回收只与内存有关,其他清理工作必须自己创建普通方法来完成(如屏幕上绘制内容的清除)。

  finalize()方法有何用?

  在使用Native(本地)方法的情况下,其他使用其他语言分配的内存空间无法由GC回收,这时就要使用finalize()方法进行释放。

6、GC工作原理

  引用计数:当有引用指向对象时,计数加一;引用离开作用域或置为null时,计数减一。计数值减为0时,对象被清理。(出现循环引用时就完蛋啦)。

  对任何“活着的”对象,一定能够追溯到其存活在堆栈或静态存储区中的引用。反过来,从堆栈或静态存储区中的引用开始,遍历到的所有对象都是“活的”。

  停止-复制方法:停止程序执行,然后遍历所有对象,将对象从当前堆复制到另一个堆,没有被复制的就是垃圾。(代价很大,但是能实现内存紧缩效果)

  标记-清扫:遍历,并给对象设标记。等标记工作完成后再清理。不会产生复制操作,在垃圾很少是速度很快。

  自适应技术

    内存分配以较大的块为单位,对象较大则可以占据单独的块,停止-复制方法可以往废弃的块中拷贝对象。

    如果所有对象都很稳定,垃圾较少时,则采用标记-清理方法。

    同时,跟踪标记-清理效果,碎片多时切换回停止-复制方法。

7、成员初始化

  保证所有变量在使用前都能得到恰当的初始化。局部变量以编译时错误的方式来保证。

  类变量有初始值,该初始值由系统规定,在类加载时初始化。

  怎么给变量赋初值?

    1、定义类变量时直接赋初值,定义顺序决定了初始化顺序,注意不要前向引用。

    2、构造器初始化。尽管我们在构造器里指定了类变量值,但是类加载时的自动初始化仍然会在构造器之前完成。

    3、静态变量初始化。静态初始化只会在类的Class对象首次加载时进行。

    4、显示的静态初始化,即在static代码块里进行初始化。也是在Class对象加载时执行。

    5、非静态实例初始化,即在代码块里,在构造器之前执行。

  数组初始化:

    编译器不允许指定数组大小。为了给数组分配空间,使用数组之前,必须进行初始化。

    浅拷贝:只是复制了引用,即执向了同一个地址,资源只有一份。

    深拷贝:资源被复制,分配了新的空间。

  可变参数列表:

    1、将参数设为Object数组,但是,传参时要自己打包。

    2、使用可变参数语法,该语法也适用于其他类型,基本类型也可(自动打包)。

      底层原理是编译器帮我们进行打包。

      尽量只在重载方法的一个版本上使用,以免造成混乱,编译器无法分派。

  枚举类型:

    在创建enum时,编译器会会自动创建toString()、ordinal()、static value() 方法。

    枚举和switch搭配食用效果更佳哦。

    

    

  

  

标签:初始化,4Edition,对象,编译器,static,引用,TIJ,方法
来源: https://www.cnblogs.com/lqblala/p/15130899.html