读《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
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- mysqlbinlog命令详解 Part 3 - 查看十六进制格式内容
- MySQL information_schema详解 CHARACTER_SETS 表
- 彻底弄懂 Unicode 编码
- 两种使用代码获得SAP CRM product sales status的办法
- C#: "$"作用和用法
- SAP ABAP字符和字符串变量隐式转换的一些规则
- MySQL information_schema详解 COLLATION_CHARACTER_SET_APPLICABILITY
- 如何处理Angular项目在Visual Studio Code打开报关于@Decorators的警告信息
- QT 中普通数值与字符串之间的转换
- C# 时间与时间戳互转 13位
- 在C#中ref和out具体怎么使用?在什么情况下使用?
- Vs code 创建vue模版
- [892]python中re.split()方法
- MacOS抓包工具Charles
- PYTHON替代MATLAB在线性代数学习中的应用(使用Python辅助MIT 18.06 Linear Algebra学习)