文章目录
1.用构造器确保初始化
- 构造器与类同名
- 在操作对象前,已为对象分配内存空间,并调用相应构造器对象已被初始化了
2.方法重载
- 构造器/方法名相同,形式参数不同(参数列表不同)包括参数顺序不同
3.默认构造器(无参构造器)
- 如果你写的一个类中没有构造器,则编译器会自动帮你船舰一个默认构造器
- 如果你已经定义了一个构造器(无论有参还是无参),编译器就不会自动创建无参构造器了
4.this关键字
-
this关键字表示:“调用方法的那个对象”的引用
-
通常写this的时候,都是指“这个对象”或“当前对象”而且它本身表示对当前对象的引用
-
static含义
(1).在没有创建任何对象的前提下,仅通过类本身,就可以调用static方法
(2).static方法就是没有this的方法
5.清理
- 对象可能不被垃圾回收
- 垃圾回收并不等于“析构”
- 垃圾回收只与内存有关
- finialize()用途
- 使用垃圾回收的唯一原因是为了回收程序不再使用的内存
-
垃圾回收机器如何工作
(1) 垃圾回收机器可以提高对象创建速度
(2) JVM中,它像一个传送带,每分配一个新对象,垃圾回收机器就往前移一格
(3) 一面回收空间,一面使堆中的对象排列更加紧凑
(4) 实现了一种高速的,有无限空间可以无限分配的堆模型
(5) 垃圾回收机制
i.引用计数
1.简单速度慢(不被JVM应用)
2.每个对象都有一个计数器,当有引用连接至对象时,引用计数加1,当引用离开作用域时被置null,引用计数减1
ii.停止—复制
1.先暂停程序运行,将存活的对象从当前堆复制到新堆中,没复制的就是垃圾。在新堆中,对象是紧凑排列的。
2.缺陷:
a.效率低:需要两个堆,维护需要比实际多一倍空间
b.复制问题:程序稳定运行后,垃圾很少,仍将内存从一处复制到另一处的浪费
iii.标记—清扫
1. 当没有垃圾的时候用此模式
2. 遍历所有引用,每找到一个存活对象就标记,待标记工作完成,开始清理未标记对象
iv.自适应
1.JVM中,内存分配以比较大的“块”为单位,垃圾回收器,在回收的时候往废弃“块”里拷贝对象。如果“块”在某处被引用“代数”增加;垃圾回收器会整理上次回收动作后的块。
2.大型对象不会被复制,小型对象会被复制并整理。
3.JVM监视所有对象稳定,垃圾回收效率低的话,自动切换至“标记—清扫“方式。
4.若堆空间出现很多碎片,自动切换至”停止—复制“方式
v.”即时“编译
1.将程序翻译成本地机器码,提高速度
2.当需要装载某个类时,编译器会找到其class文件,然后将类的字节码加入到内存中
3.即时编译器,会编译所有代码。缺陷:
a.这种加载动作散落在整个程序生命周期内,累加起来更费时间
b.会增加代码长度,导致页面调度,降低程序速度
vi.惰性评估
即时编译器只在必要时,才会编译代码
6.成员初始化
- 局部变量,强制程序员提供初始化
- 类的成员变量(即字段)是基本类型,编译器会给一个默认值
7.构造器初始化
静态数据初始化
- 无论创建多少个对象,静态数据都只占用一份存储空间
- static关键字不能应用于局部,因此它只能作用于域
- 如果一个域时静态基本类型域,且没有对他进行初始化,那么它就会获得基本类型的标准初值
- 如果它是一个对象引用,那么它的默认初始化值就是null
- 初始化顺序:先”静态“对象;后”非静态“对象
- 静态初始化只在class对象首次加载的时候进行一次
8.初始化数组
可变参数列表
- 不确定参数的个数时,可以使用可变的参数列表
- 语法:参数类型 …(三个点)
例如:void printArray (Object …) - 作用:有了可变参数,就再也不用显示的编写数组语法了。当你指定参数时,编译器实际上会为你去填充数组
- 可变参数列表与自动包装机制可以和谐共处
9.枚举类型(enum)
-
例:
public enum Spiciness { NOT, MILD, MEDIUM, HOT, FLAMING }
-
这里创建了名为Spiciness的枚举类型,由于枚举类型的实例都是常量,因此用大写字母表示(多个文字下划线分割)
-
创建enum时,编译器会:
(1)创建 toString() 方法:方便显示enum实例名
(2)创建 ordinal() 方法:表示enum的声明顺序
(3)创建 static valuse() 方法:按照enum常量的声明顺序,产生由这些常量值构成的数组 -
enum可以在switch语句中使用,
public class Burrito { Spiciness degree; public Burrito(Spiciness degree) { this.degree = degree;} public void describe() { System.out.print("This burrito is "); switch(degree) { case NOT: System.out.println("not spicy at all."); break; case MILD: case MEDIUM: System.out.println("a little hot."); break; case HOT: case FLAMING: default: System.out.println("maybe too hot."); } } public static void main(String[] args) { Burrito plain = new Burrito(Spiciness.NOT), greenChile = new Burrito(Spiciness.MEDIUM), jalapeno = new Burrito(Spiciness.HOT); plain.describe(); greenChile.describe(); jalapeno.describe(); } }