《Java编程思想》ch5.初始化与清理

初始化与清理

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

5.1用构造器确保初始化

构造器是一种特殊类型的方法,因为它没有返回值。构造器采用与类相同的名称,通过提供构造器,类的设计者可确保每个对象都会得到初始化。其中,不接受任何参数的构造器叫做默认构造器,也叫无参构造器。

5.2方法重载

方法名相同而形参不同的方法同时存在成为方法重载。
每个重载方法都必须有一个独一无二的参数列表,甚至参数顺序的不同也足以区分两个方法。

5.3默认构造器

作用:创建一个默认对象,如果你写的类中没有构造器,则编译器会自动帮你创建一个默认构造器。如果已经定义了一个构造器(无论是否有参数),编译器就不会帮你自动创建默认构造器。

5.4this关键字

只能在方法内部使用,表示对“调用方法的那个对象”的引用。
this的用法和其他对象引用并无不同。
注意,在方法内部调用另一个方法,就不必使用this,直接调用即可。
this关键字可用于返回当前对象的引用,将当前对象传递给其他方法,以及在构造器中调用构造器。
注意,只能用this调用一个构造器,并且必须置于最起始处。
另,static方法就是没有this的方法。

5.5清理:终结处理和垃圾回收

finalize():一旦垃圾回收器准备好释放对象占用的存储空间,将首先调用finalize()方法,并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存。
1、对象可能不被垃圾回收
2、垃圾回收并不等于“析构”
3、垃圾回收只与内存有关
finalize()的使用需求:通过某种创建对象以外的方式为对象分配了存储空间。比如调用了C语言的malloc()方法,需要在finalize()中用本地方法调用free()。
finalize()另一个用法:验证对象终结条件。
实例:

class Book{
  boolean checkedOut = false;
  Book(boolean checkOut){checkedOut = checkOut;}
  void checkIn(){checkedOut=false;}
  protected void finalize(){
    if(checkedOut){System.out.println("Error:checked out");
  }
}
public class TerminationCondition{
  public class void main(String[] args){
    new Book(true);
    System.gc();
}

本例的终结条件是:所有的Book对象在被当作垃圾回收之前都应该被签入(check in)。但是在main函数中,由于程序员的错误,有一本书未被签入,要是没有finalize方法来验证终结条件,将很难发现这种缺陷。

5.6成员初始化

Java尽力保证:所有变量在使用前都能得到恰当的初始化。对于方法的局部变量,Java以编译时错误的形式来贯彻这种保证。
指定初始化示例:

public class Demo{
  boolean bool = true;
  int n = 6;
}

5.7构造器初始化

注:自动初始化将在构造器被调用之前发生。

public class Counter {
  int i;
  Counter() { i = 7;}
}

此代码,首先i会初始化为0,然后变成7。因此,编译器不会强制你一定要在构造器的某个地方或在使用它们之前对元素进行初始化——因为初始化已经得到了保证。

静态初始化:static域的初始化。(只在必要时刻才会进行)。

对象创建过程总结,假设有一个Dog类:
1、即使没有显式地使用static关键字,构造器实际上也是静态方法。当首先创建类型为Dog的对象时,或者Dog类的静态方法/域首次被访问时,Java解释器必须查找类路径,以定位Dog.class文件。
2、载入Dog.class,有关静态初始化的所有动作都会执行。静态初始化只在Class对象首次加载的时候进行一次。
3、当用new Dog()创建对象的时候,首先将在堆上为Dog对象分配足够的存储空间。
4、这块存储空间会被清零。自动将对象中所有基本类型数据设置成默认值,引用设置为null值。
5、执行所有出现于字段定义处的初始化动作。
6、执行构造器。

显示的静态初始化:

public class Spoon{
  static int i;
  static{ i = 47;}
}

这段static代码只执行一次:当首次生成这个类的一个对象时,或者首次访问属于那个类的静态数据成员时(即便从未生成过这个类的对象)。

非静态实例初始化:

public class Demo{
  int i;
  {i=5;}
}

该初始化使得你可以保证无论调用了哪个显式构造器,某些操作都会发生。

5.8数组初始化

int[] a = {1,3,5};
Integer[] a = new Integer[]{
  new Integer(2);
  new Integer(4);
}

可变参数列表

public class Demo{
  static void printArray(Object[] args){
    for(Object obj : args){
      System.out.println(obj + " ");
    }
  }
  static void printArray(Object... args){
     for(Object obj : args){
      System.out.println(obj + " ");
    }
  }
}

5.9枚举类型

enum关键字,Java SE5添加的新特性

public enum Spiciness{NOT, MILD, MEDIUM, HOT, FLAMING}
public class SimpleEnumUse{
  public static void main(String[] args){
    Spiciness howHot = Spiciness.HOT;
    System.out.println(howHot);
    for(Spiciness s : Spiciness.values()){
      System.out.println(s+ ". ordinal " + s.ordinal());
    }
  }
}

enum特性:可用于switch语句

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341

推荐阅读更多精彩内容