Reading Thinking in Java #3
......跳过,跳过,第一句要提醒自己的是:一旦写下一个任意形式签名(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。书上的例子如下:
// 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相关推荐
- ERROR manager.SqlManager: Error reading from database: java.sql.SQLException: Streaming result set
问题 在使用sqoop导入数据时,报如下错误: ERROR manager.SqlManager: Error reading from database: java.sql.SQLException ...
- I/O error reading PNG header! java截取png图片时遇到的问题
解决方法 Iterator < ImageReader > it=ImageIO.getImageReadersByFormatName(suffix); 上边的代码换成下边那句话 Ite ...
- Java SE 8 在并发工具方面的加强
本文首发于InfoQ. Java 8在Lambda表达式.接口默认方式.新的日期API等方面引入的新特性广受关注,同时在并发编程方面也做出了大量改进.以往的几个Java版本都对java.util.co ...
- 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 ...
- java如何读取文本,Java:如何读取文本文件
桃花长相依 这个示例代码向您展示了如何在Java中读取文件.import java.io.*;/** * This example code shows you how to read file in ...
- java mail 收发邮件
java mail 收发邮件 1.发件 2.收件 1.发件 package base.util; /* Some SMTP servers require a username and passwor ...
- java核心教程_核心Java教程
java核心教程 Welcome to Core Java Tutorial. I have written a lot on Core Java and Java EE frameworks. Th ...
- java des算法_Java DES算法程序
java des算法 Java Cryptography Extension (JCE) provides framework and implementation for generating ke ...
- java中treemap_Java TreeMap – Java中的TreeMap
java中treemap Java TreeMap is one of the Map implementation and it's part of Java Collections framewo ...
- 如何在Java中将集合转换为列表
Lists in Java are ordered collection of data, whereas sets are an unordered collection of data. A li ...
最新文章
- 六款小巧的HTTP Server
- chrome developer tools小技巧
- 自然语言处理python进阶(一)
- Python 绘制出酷炫的三维图
- 五年php面试题,找工作的你不容错过的45个PHP面试题附答案(下篇)
- 数据科学和人工智能技术笔记 五、文本预处理
- 转:我用了18年,才可以和你一起喝咖啡
- 基于深度学习的自然场景文字识别系统研究 faster-RCNN + CRNN (二)
- 如何用Python给自己做一个年终总结
- java畜牧场信息管理系统
- 【渝粤教育】广东开放大学 古代汉语 形成性考核 (28)
- 如何看待个人的信息价值
- 第二课 IDEA 的使用
- 正则表达式 \w \s \d \b
- 观点丨非洲区块链概览
- php(TP5)图片无损压缩上传到七牛云
- 仪表放大器的一些心得体会
- 第一部分:简单句——第一章:简单句的核心——二、简单句的核心变化(谓语动词的情态)
- 分布式聊天系统(IM)架构
- 南邮 OJ 1659 牛顿苹果