Java 补强 02 类初始化和访问权限

作者 柚爸
  1. 构造器
  2. 终结回收和垃圾回收
  3. 数组
  4. Enum 枚举类
  5. 访问权限控制

构造器

构造器的本质就是为对象分配空间, 然后初始化, 返回指向对象的指针. 默认构造器和指定构造器的关系比较熟悉了. Java中初始化和创建捆绑在一起, 并不能像C系语言一样把声明和初始化分离.

构造器没有返回值.

this也可以用来返回当前对象的引用, 这个是链式调用的关键, 记得要想到这个方面, 也可以把自身的引用传递给外部方法, 用于类之间的交互, 很有意思.

构造器初始化之前, 变量会先变成0, 这感觉就是底层机制决定的(匿名页), 然后被赋给构造器里的值. 类变量按照定义顺序初始化,即使散落开来也是这样, 先按顺序初始化所有变量.

类加载的顺序:

  1. 构造器是静态方法, 所以创建一个对象的时候, 或者首次使用这个对象的静态方法/静态域的时候, 查找class文件然后加载
  2. 载入class文件, 创建class对象. 此时执行静态初始化的全部动作
  3. 在堆上分配空间并初始化非静态变量
  4. 将空间清0
  5. 执行所有字段定义处的初始化
  6. 执行构造器函数和其中的初始化

静态块可以写一起, 只会初始化一次.

还有非静态块, 静态块和非静态块的存在意义主要是无论调用哪个构造器, 都会执行, 这样就不会因为某个构造器没有执行而不会进行某些必要的初始化工作了.

也就是说一定要完成的初始化工作可以放入静态和非静态块中, 而根据构造器不同而来的初始化就写在构造器中即可.

终结回收和垃圾回收

现在的finalize()方法显示过时了, 调用System.gc()可以强制回收, 这样finalize()方法就有用处了. Effective Java里也提到了无需使用finalize()方法.

数组

声明数组和C系不同, 不能指定大小. 感觉Java内部也是将其封装成了一个对象, 而不是像C系一样赤裸裸的露在外边. 如果需要特定的空间, 可以使用花括号初始化表达式.

实际创建数组的时候, 才能够指定大小.

有了数组就可以使用简化的不定长度的参数了Object... args

Enum 枚举类

Java SE5中可以使用枚举类了. 声明如下:

public enum Spice {
    SUGAR, SALT, HOT
}

使用的时候直接 Spice spice = Spice.SUGAR 即可, 就像把一个静态变量赋值给一个枚举类型的变量即可.

enum还可以在switch语句中使用.

访问权限控制

使用import 静态导入, 可以直接导入一个类的内容, 这种通常可以用于从工具库中导入工具.

再看一下这几种权限, 权限指的是在编写程序的时候, 是不是可以访问或者引用一个包里的某个类:

  1. 无前缀, 包访问权限, 包外部不可访问
  2. public, 接口访问权限, 即全部都可以访问, 是对外暴露的接口
  3. private, 无法访问权限
  4. protected, 继承访问权限, 同时也提供包访问权限, 这个要注意

类的权限相比上边的四个, 只能设置成public或者不设置(内部类除外), 将构造器设置为private, 然后通过一个静态变量返回一个该类的对象, 这被叫做单例模式.