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

时间:2019-09-03
本文章向大家介绍读《java编程思想》5-初始化与清理,主要包括读《java编程思想》5-初始化与清理使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
1、构造器确保对象初始化
构造器名字和类名相同,没有参数的构造器叫默认构造器或者无参构造器。
系统默认给每个类创建默认构造器,但如果类中已经存在构造器,则系统不会再创建。
java中创建 和 初始化 两者绑定在一起,不能分离,使用new构造对象。
(OC中则不同, 如:Car *car = [[Car alloc] init])
 
2、方法重载
方法名相同,参数列表不同。(不能通过返回值区分方法重载)
 
3、基本数据类型重载
如果实参类型 小于方法形参的类型,则实参会被类型提升。(基本数据类型)
如果实参类型 大于方法形参的类型,则实参需要窄化转换。
 
4、this关键字只能在方法内部使用,表示当前调用方法的对象引用。
 
5、构造器中调用构造器this()
(1)必须放在第一行调用。
(2)只能构造器使用,并且一个构造器只能调用一次。
 
6、static含义
static就是没有this的方法。
static方法内部不能调用非静态方法。
 
7、清理-终结处理 finalize方法
(1)对象可能不被垃圾回收
频繁回收消耗资源而且会造成暂停应用程序stop the world,gc是能不回收就不回收。
(2)回收垃圾并不等于”析构“
C++中析构函数是由程序员控制(delete) 或者离开器作用域时自动调用发生, 是在确定的时间对对象进行销毁并释放其所占用的内存,而垃圾回收的发生由jvm决定,并且不确定发生。
(3)垃圾回收只与内存相关
垃圾回收只会负责释放对象所占据的所有内存(new出来的对象)。那么通过某种创建对象以外的方式为对象创建的存储空间,比如是要用jni本地方法创建分配的内存,就可以在finalize方法里释放。
finalize方法由 jvm调用,且只会调用一次。(自己手动调用不算)
调用流程:
一旦垃圾回收器准备释放内存时,如果对象覆盖了默认finalize方法,且方法体不为空,则会先调用此方法,并且在下一次垃圾回收时才会真正回收此对象。
 
finalize方法另外一个用途在于“终结条件”验证, 通过finalize()方法来试图找出程序的漏洞。
(4)finalize()不一定会被调用,不可信,尽量避免使用finalize()
 
8、清理-垃圾回收
jvm有一个”自适应的、分代的、停止-复制、标记-清理“式垃圾回收器。
(具体扩展见《读《java编程思想》5-初始化与清理-垃圾回收机制》)
 
9、JIT 即时编译
当JVM发现某个方法或代码块运行特别频繁的时候,就会认为这是“热点代码”(Hot Spot Code)。然后JIT会把部分“热点代码”编译成本地机器相关的机器码,并进行优化,然后再把编译后的机器码缓存起来,以备下次使用。
 
10、成员变量初始化
所有成员使用前都默认有初始化值,java没有向前引用。
 
11、java类初始化顺序
如果没有继承:
静态域 -> 实例域 -> 构造器
 
如果存在父子继承:
父静态域 -> 子静态域-> 父实例域-> 父构造器 -> 子实例域-> 子构造器
 
这里域通常指的是field,这里包含属性和代码块,他们按照代码前后顺序初始化。
静态域 = 静态对象 + 静态代码块。
实例域 = 实例对象 + 实例代码块。
 
简单说
先静态 后非静态
先成员 后构造器
先父后子
 
 
参考
《java编程思想第四版》

原文地址:https://www.cnblogs.com/shineup/p/11453155.html