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