随着计算机革命的发展,“不安全”的编程方式已逐渐成为编程代价高昂的主因之一。

1.用构造器确保初始化

  • 构造器:在创建对象时被自动调用的特殊方法.
  • 构造器命名问题:1.所取得任何名字可能与类的某个成员命名冲突;2.调用构造器是编译器的责任,所以应该让编译器知道该调用哪个方法.
  • 构造器命名:与类名相同,所以"每个方法首字母小写"的编程风格不适用于构造器.
  • 构造器没有返回值(new表达式返回了对新建对象的引用,但构造器本省并没有返回任何值).

2.方法重载

  • 目的:为了让方法名相同而形式参数不同的构造器同时存在.
  • 方法重载是构造器所必需的,但亦可用于其他方法.
  • 区分:参数类型列表,参数顺序(代码难以维护),涉及基本类型的重载(易混淆),返回值(为了副作用而调用就会忽略其返回值 ×)

3.默认构造器

  • 如果类中没有构造器,编译器会自动创建一个默认构造器.
  • 如果已有构造器,则不会创建.

4.this关键字

  • 为了能用简便,面向对象的语法来编写代码,编译器做了一些幕后工作,他把"所操作对象的引用"作为第一个参数传给方法(注:一般是通过对象的引用来调用方法,编译之后通过对象来调用).
  • 只能在方法内部使用,表示对"调用方法的那个对象"的引用.
  • 如果在方法内部,调用同一个类的另一个方法,则不必使用this,直接调用即可.
  • 需要返回当前对象的引用时,return this;.
  • 将当前对象作为参数传递给其他对象.
  • 在构造器中调用构造器(只能调用一个,且必须将构造器的调用至于最起始处).
  • static方法:没有this的方法.

5.清理:终结处理和垃圾回收

  • finalize().
  • 对象可能不被垃圾回收.
  • 垃圾回收并不等于"析构".
  • 垃圾回收只与内存有关.
  • 引用计数:常用开说明垃圾收集的工作方式.
  • 复制式回收器:效率低(1,空间大;2,复制).
  • 标记-清扫 模式.

6.成员初始化

  • 局部变量必须进行初始化.
  • 类的数据成员(全局变量),基本类型会默认有一个初始值,对象引用会获得特殊值null.
  • 指定初始化:定义的时候直接赋值或通过方法调用赋值.

7.构造器初始化

  • 通过构造器来进行初始化(无法阻止自动初始化的进行,它将在构造器调用之前发生).
  • 变量定义的先后顺序决定了初始化的顺序.
  • 静态数据初始化:只有在第一个对象创建(或者第一次访问静态数据)的时候,才会被初始化,仅执行一次.
  • 显式的静态数据初始化:静态代码块.
  • 非静态实例初始化:普通代码块(匿名内部类的chu'shi'hua).
  • 构造器没有显式地使用static,但也是静态方法.
  • 对象的创建过程
    1.当诗词创建对象或者类的静态方法/静态域首次被访问时,Java解释器查找类路径,定位.class文件.
    2.载入.class,有关静态初始化的所有动作被执行(首次加载时进行一次).
    3.用new操作符创建对象,在堆上为对象分配足够的存储空间.
    4.存储空间清零,为对象中的全局变量赋值.
    5.执行所有出现于字段定义处的初始化动作.
    6.执行构造器.

8.数组初始化

  • 数组:相同类型的,用一个标识符名称封装到一起的一个对象序列或基本类型数据序列.通过方括号下标操作符来定义和使用的.
  • 编译器不允许指定数组的大小.
  • 初始化表达式:由一对花括号括起来的值组成.在这种情况下,存储空间的分配(等价于使用new)由编译器负责.
  • 固有成员length,只能访问不能修改.
  • 可变参数列表.

9.枚举类型

  • 枚举类型的实例是常量,按照命名惯例使用大写字母表示(多个单词用下划线隔开).
  • 为了使用enum,需要创建一个该类型的引用,并将其赋值给某个实例.
  • 编译器自动添加toString(),ordinal()(声明顺序),values()(按声明顺序,产生由常量构成的数组)方法.
  • 与switch配合使用.

END


JadeQYuan
279 声望311 粉丝

知其然,知其所以然。。。