初始化与清理
2017-03-24 11:09:03 0 举报
AI智能生成
Java编程思想,初始化和清理
作者其他创作
大纲/内容
用构造器确保初始化
构造器名字和类名相同,确保编译器知道易于调用
默认构造器(无参构造器),如果只声明有参构造器,则不能通过其他任何方式创建
构造器没有返回值,若有返回值,必须得让编译器知道如何处理,new表达式返回了对象的引用
方法重载
不需要对每个概念使用不同词汇
构造器是重载方法名的一个原因(多种方式创建对象)
每个重载方法参数类型列表不同,或顺序不同
基本类型重载
基本类型从较小自动提升为较大类型
提升顺序byte-short-int-long-float-double
char提升为int
实际参数大于重载形式参数时,要先类型转换,否则报错
以返回值不能区分重载方法,如果只调用方法,不考虑返回值,没法区分
默认构造器
如果类中没有构造器,编译器会自动创建
如果有了参数构造器,不会自动创建默认构造器
this关键字
方法内部获得对当前对象的引用
this关键字对于将当前对象传递给其他方法也很有用
同类中存在多个构造器,互相调用可使用this,必须在起始处
static含义:就是没有this的方法,static方法内不能调用非静态方法
清理:终结处理和垃圾回收
垃圾回收器只释放new分配的内存,其他形式的不回收
1.对象可能不被垃圾回收
2.垃圾回收不等于析构
3.垃圾回收只与内存有关
垃圾回收时finalize()被调用,适用于本地方法分配的内存,调用free()释放等
无论是垃圾回收还是终结都不保证会发生,如果并未面临内存耗尽的情形
System.gc()用于强制进行终结动作,会调用finalize()方法
垃圾回收期
C++的堆像一个院子,每个对象管理自己的地盘,对象被销毁后地盘需要重用
Java的堆更像一个传送带,每分配一个新对象,就往前移动一格,意味着分配速度快
引用计数器简单,速度慢,循环引用缺陷,实际未应用
一种思想:找到活的对象,遍历堆栈和静态存储区所有引用
常用回收方法
停止复制(stop-and-copy)
需要2个堆,空间加倍
不是在后台进行的
程序稳定后只产生少量垃圾,复制式很浪费
标记清除(mark-and-sweep)
少量垃圾时很快,一般用途速度很慢
遍历堆栈和静态区,存活对象加标记,全部标记完成后开始清除
剩下空间不连续,可以重新整理对象
不是在后台运行的
分代的
大对象占用块,每个块都有代数(generation count),记录是否存活,块在某处引用,代数增加
内含小型对象的块被复制整理
自适应:对象都很稳定,效率降低,切换到标记清除模式,堆空间碎片多,切换回停止复制模式
自适应的,分代的,停止复制,标记清除式垃圾收集器
JIT(Just-In-Time)即时编译提示速度,部分翻译成机器码
创建第一个对象装载类,找到.class文件装入内存
惰性评估,只在必要时编译代码,执行次数越多,速度越快
成员初始化
方法成员变量未初始化,编译报错
类成员变量有初始值
定义变量时初始化,方法初始化
构造器初始化
变量定义时初始化先执行,之后才是构造器初始化
变量先于方法调用前初始化,按顺序执行,与位置无关
static不能用于局部变量,先静态初始化,后是非静态对象
构造器实际上也是静态方法
静态块可以多个静态初始化一起:static{i=12;}
非静态实例初始化,{},在构造器之前执行
数组初始化
int[] a1={1,2,3};int a1[]
数组赋值是引用,修改的是同一个数组
非基本类型数组是引用数组,数组大小可以是变量
枚举类型
ordinal()表示enum常量的声明顺序
static values()方法产生按照声明顺序构成的数组
可以在switch中使用
0 条评论
下一页