Thinking in Java 4th chap5笔记-初始化与清理(二)

2014-11-24 11:10:33 · 作者: · 浏览: 2
始化动作->执行构造器->
5.static{},静态子句;{},实例初始化子句;www.2cto.com
6.数组初始化int[]array= {};int[] array = new int[]{}->前者只能用在数组定义处,而后者可以传参
可变参数列表,如int...args,String...args;可变参数列表使重载过程变的复杂了->如f(Integer...args);f(Long...args)->当调用f()的时候则编译出错,因为不知道该调用哪个f方法->可以给每个方法都就加上一个非可变参数->你应该总是只在方法的一个版本上使用可变参数列表,或者压根就不是用它;
7.enum
枚举是类,且有自己的方法;enum的名字能够倍加清楚的表明程序意欲何为的;创建enum时,编译器会自动添加一些有用的特性,如创建toString方法,很方便的显示每个enum实例的名字;还会创建ordinal方法,表示某个特定enum常量的声明顺序;static values方法,用来按照enum常量的声明顺序,产生由这些常量构成的数组;与switch是绝佳的组合;
直接将所得到的类型直接拿来使用,而不必过多的考虑,将enum用作另一种创建数据类型的方式;
在枚举之前,我们需要创建一个整型常量集,但是这些常量值并不会将其自身的取值限制在这个常量集的范围内,因此显的更有风险; 更难以使用;
当然以前这样的枚举安全机制:(个人认为还是可以满足需求的,只不过没有一些编译器添加的有用的特性,而且序列化的时候会有问题)
public class Oriented
{
private int value;
//两个安全非final枚举
public static final Oriented ORI = new Oriented(1);
public static final Oriented OR2 = new Oriendted(2);
//私有构造函数
private Oriented(int v)
{
value = v;
}
}
8.垃圾回收器的确增加了运行时的开销,而且Java解释器从来就很慢;随着时间推移,java在性能方面已经取得了长足的进步,不过速度问题仍然是它涉及某些编程领域的障碍.
9.部分 源码
package com.book.chap5.initAndDestroy;
/**
*
*Finalize用法,验证终结条件
*

本例的终结条件是:所有的book对象在垃圾回收都应该checkin;main方法中,有一本书没有被签入,被finalize方法发现,输出消息

*
*@author landon
*@since JDK1.6
*@version 1.0 2012-4-12
*
*/
public class FinalizeUsage
{
public static void main(Stringargs)
{
Book novel = new Book(true);
novel.checkIn();
new Book(true);
//强制进行终结动作[当然也可以通过重复的执行程序,假设程序将要分配大量的存储空间,而导致垃圾回收动作的进行,最终也能找到错误的Book]
System.gc();
}
}
class Book
{
private boolean checkOut;
public Book(boolean checkOut)
{
this.checkOut = checkOut;
}
/**
* 检入,书籍只有检入后才可以被垃圾回收
*/
public void checkIn()
{
checkOut = false;
}
@Override
protected void finalize()
{
if(checkOut)
{
System.out.println("Error: has book checked out");
try
{
//调用父类的finalize方法
super.finalize();
}
catch (Throwable e)
{
e.printStackTrace();
}
}
}
}
package com.book.chap5.initAndDestroy;
/**
*
*枚举enum的初步用法
*
*@author landon
*@since JDK1.6
*@version 1.0 2012-4-12
*
*/
public class SimpleEnum
{
public static void main(Stringargs)
{
Spiciness howHot = Spiciness.MEDIUM;
//打印枚举,toString方法已实现
System.out.println(howHot);
//ordinal按照声明顺序从0开始
for(Spiciness spiciness : Spiciness.values())
{
System.out.println(spiciness + " ordinal:" + spiciness.ordinal());
}
testSwitchEnum(Spiciness.MILD);
testSwitchEnum(Spiciness.HOT);
testSwitchEnum(Spiciness.FLAMING);
}
//测试enum和switch的组合
public static void testSwitchEnum(Spiciness spiciness)
{
switch(spiciness)
{
//注意case必须是NOT必须是无限制的枚举名称[spiciness的类型已经确定是枚举Spiciness,没有必要特意加上Spiciness.NOT,画蛇添足],而不是Spiciness.NOT,否则编译报错The qualified case label Spiciness.NOT must be replaced w