Chapter 4 : Initialization & Cleanup

......跳过,跳过,第一句要提醒自己的是:一旦写下一个任意形式签名(signature)的构造函数,编译器将不会再提供自动生成default构造函数。

在构造函数中调用构造函数(Calling constructors from constructors)

需要注意的是super与this两种在构造函数调用构造函数的方式,必须是构造函数中的第一句语句。这也就以为着,一个构造函数中只能使用二者中的一个。
例如:

/**//*
 * Created on 2004-11-26
 *
 * TODO To change the template for this generated file go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
package com.smilereader.test;

/**//**
 * @author Sinbadblue Kong
 *
 * TODO To change the template for this generated type comment go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
public class Dragon {
    private String name;
    
    private int challengeRank;    
    
    /**//**
     * @param name The name of a Dragon
     */
    protected Dragon(String name){
        this.name = name;
    }

    /**//**
     * @param name
     * @param challengeRank
     */
    protected Dragon(String name, int challengeRank) {
        super();
        this.name = name;
        this.challengeRank = challengeRank;
    }
    /**//**
     * @return Returns the name.
     */
    String getName() {
        return name;
    }
    /**//**
     * @return Returns the challengeRank.
     */
    int getChallengeRank() {
        return challengeRank;
    }
}
/**//*
 * Created on 2004-11-26
 *
 * TODO To change the template for this generated file go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
package com.smilereader.test;

/**//**
 * @author Sinbadblue Kong
 *
 * TODO To change the template for this generated type comment go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
public class RedDragon extends Dragon {
    
    /**//**
     * @param name
     * @param challengeRank
     */
    public RedDragon(String name, int challengeRank) {
        super(name, challengeRank);
        // TODO Auto-generated constructor stub
    }
    /**//**
     * @param name The name of a RedDragon
     */
    public RedDragon(String name) {
        this(name,14);        
        // TODO Auto-generated constructor stub
    }

}
/**//*
 * Created on 2004-11-26
 *
 * TODO To change the template for this generated file go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
package com.smilereader.test;

import junit.framework.TestCase;

/**//**
 * @author Sinbadblue Kong
 *
 * TODO To change the template for this generated type comment go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
public class RedDragonTest extends TestCase {

    /**//*
     * Class under test for void RedDragon(String, int)
     */
    public void testRedDragonStringint() {
        RedDragon rd = new RedDragon("Magi",16);
        assertEquals("Magi",rd.getName());
        assertEquals(16,rd.getChallengeRank());
    }

    /**//*
     * Class under test for void RedDragon(String)
     */
    public void testRedDragonString() {
        RedDragon rd = new RedDragon("Fireball");
        assertEquals("Fireball",rd.getName());
        assertEquals(14,rd.getChallengeRank());
    }

}

Cleanup

首先,Java的finalize( )不是C++中的析构函数。有一点就足以区分它们,finalize( )不会在一个对象无效(即不存在reference指向它)时自动调用。finalize( )发生作用是在Java的垃圾回收器处理时调用的,具体步骤是这样:当垃圾回收器打算回收某个对象的内存空间时,首先会调用其finalize( )函数。而再下一次的垃圾回收动作时才真正回收这个对象的内存空间。因为垃圾回收器何时会处理是无法确定的,所以也就不可能依赖finalize( )来完成部分非内存空间的cleanup。例如,与数据库的连接。这时,就需要自行在需要的时候调用某些函数来完成这些cleanup操作。这点和C++的析构函数相比似乎就少了些便利性。

The termination condition 终止条件

Bruce 在TIJ中提到了一种finalize( )的用法,称为终止条件。因为在对象被垃圾回收器回收前,必定会被其调用finalize( )。由此,可以在finalize( )中加入判断对象的终止条件以对于程序的逻辑正确性做判断。不过,在我看来这个实在是太不实用了。想想,垃圾回收动作甚至可能发生在程序结束后,如果内存远远空闲的话。为此,必须用System.gc( ) 强迫终结动作。即使就Bruce所说的:你应该在程序开发过程中进行此事,以便于debugging。书上的例子如下:

//: c04:TerminationCondition.java
// Using finalize() to detect an object that
// hasn't been properly cleaned up.
import com.bruceeckel.simpletest.*;

class Book {
  boolean checkedOut = false;
  Book(boolean checkOut) {
    checkedOut = checkOut;
  }
  void checkIn() {
    checkedOut = false;
  }
  public void finalize() {
    if(checkedOut)
      System.out.println("Error: checked out");
  }
}

public class TerminationCondition {
  static Test monitor = new Test();
  public static void main(String[] args) {
    Book novel = new Book(true);
    // Proper cleanup:
    novel.checkIn();
    // Drop the reference, forget to clean up:
    new Book(true);
    // Force garbage collection & finalization:
    System.gc();
    monitor.expect(new String[] {
      "Error: checked out"}, Test.WAIT);
  }
} /**////:~

转载于:https://www.cnblogs.com/sinbadblue/archive/2004/11/26/69022.html

Reading Thinking in Java #3相关推荐

  1. ERROR manager.SqlManager: Error reading from database: java.sql.SQLException: Streaming result set

    问题 在使用sqoop导入数据时,报如下错误: ERROR manager.SqlManager: Error reading from database: java.sql.SQLException ...

  2. I/O error reading PNG header! java截取png图片时遇到的问题

    解决方法 Iterator < ImageReader > it=ImageIO.getImageReadersByFormatName(suffix); 上边的代码换成下边那句话 Ite ...

  3. Java SE 8 在并发工具方面的加强

    本文首发于InfoQ. Java 8在Lambda表达式.接口默认方式.新的日期API等方面引入的新特性广受关注,同时在并发编程方面也做出了大量改进.以往的几个Java版本都对java.util.co ...

  4. java write to files_Java 8 write to file example

    Java 8示例将内容导入文件. 您可以在链接的博客文章中找到reading files using java 8 APIs示例. 1. Java 8 write to file using Buff ...

  5. java如何读取文本,Java:如何读取文本文件

    桃花长相依 这个示例代码向您展示了如何在Java中读取文件.import java.io.*;/** * This example code shows you how to read file in ...

  6. java mail 收发邮件

    java mail 收发邮件 1.发件 2.收件 1.发件 package base.util; /* Some SMTP servers require a username and passwor ...

  7. java核心教程_核心Java教程

    java核心教程 Welcome to Core Java Tutorial. I have written a lot on Core Java and Java EE frameworks. Th ...

  8. java des算法_Java DES算法程序

    java des算法 Java Cryptography Extension (JCE) provides framework and implementation for generating ke ...

  9. java中treemap_Java TreeMap – Java中的TreeMap

    java中treemap Java TreeMap is one of the Map implementation and it's part of Java Collections framewo ...

  10. 如何在Java中将集合转换为列表

    Lists in Java are ordered collection of data, whereas sets are an unordered collection of data. A li ...

最新文章

  1. 六款小巧的HTTP Server
  2. chrome developer tools小技巧
  3. 自然语言处理python进阶(一)
  4. Python 绘制出酷炫的三维图
  5. 五年php面试题,找工作的你不容错过的45个PHP面试题附答案(下篇)
  6. 数据科学和人工智能技术笔记 五、文本预处理
  7. 转:我用了18年,才可以和你一起喝咖啡
  8. 基于深度学习的自然场景文字识别系统研究 faster-RCNN + CRNN (二)
  9. 如何用Python给自己做一个年终总结
  10. java畜牧场信息管理系统
  11. 【渝粤教育】广东开放大学 古代汉语 形成性考核 (28)
  12. 如何看待个人的信息价值
  13. 第二课 IDEA 的使用
  14. 正则表达式 \w \s \d \b
  15. 观点丨非洲区块链概览
  16. php(TP5)图片无损压缩上传到七牛云
  17. 仪表放大器的一些心得体会
  18. 第一部分:简单句——第一章:简单句的核心——二、简单句的核心变化(谓语动词的情态)
  19. 分布式聊天系统(IM)架构
  20. 南邮 OJ 1659 牛顿苹果

热门文章

  1. CTO:不要在代码中写 set/get 方法了,逮一次罚款...
  2. 硬核! BAT 究竟是怎么玩转中台的!
  3. 我们精心整理的2019最新全栈资料!首次公布
  4. “干活的干不过写PPT 的”:新东方年会神曲刷屏背后:这3点值得我们思考
  5. 杭州29岁IT男凌晨突发脑出血!老父亲面对医生急的差点跪下
  6. 拼多多的硬核逆生长!
  7. Git版本控制及远程仓库的使用
  8. 权限Permissions
  9. 20172329《程序设计与数据结构》实验一:线性结构实验报告
  10. more 分页显示文件内容