Thinking in Java 4th chap7笔记-复用类(三)
+ " k =" + k);
}
private static int x2 = printInit("static Beetle.x2 initialized");
public static void main(Stringargs)
{
System.out.println("Bettle Constructor");
//可以将初始化的对象代码注释掉,不过static Inspect.x1 initialized和static Beetle.x2 initialized依然打印了出来
Beetle beetle = new Beetle();
}
}
class Inspect
{
private int i = 9;
protected int j;
public Inspect()
{
System.out.println("i = " + i + " j=" + j);
j = 23;
}
private static int x1 = printInit("static Inspect.x1 initialized");
static int printInit(String s)
{
System.out.println(s);
return 1;
}
}
package com.book.chap7.reuse;
/**
*
*测试空白final的使用
*
不同的构造函数执行不同的初始化
*
*@author landon
*@since JDK1.6
*@version 1.0 2012-4-19
*
*/
public class BlankFinal
{
private final int i = 0;//这里定义的时候就初始化了final
private final int j;//空白final,注:如果空白final一直未初始化的话,编译器会报错:The blank final field j may not have been initialized
private final Poppet poppet;//空白的final引用,编译器错误同上
public BlankFinal()
{
//构造函数中初始化black final fiend and reference
j = 1;
poppet = new Poppet(1);
}
public BlankFinal(int x)
{
//另一个构造函数初始化空白final不同的值
j = x;
poppet = new Poppet(x);
}
public static void main(Stringargs)
{
new BlankFinal();
new BlankFinal(24);
}
}
class Poppet
{
private int i;
public Poppet(int ii)
{
i = ii;
}
}
package com.book.chap7.reuse;
import static java.lang.System.out;
/**
*
*CAD
系统
*
本例测试复用过程中的正确清理1.自己的清理方法2.按照C++析构的顺序,同构造函数相反
*
*@author landon
*@since JDK1.6
*@version 1.0 2012-4-17
*
*/
public class CADSystem extends Shape
{
//TODO 注意三个成员变量的声明顺序,析构的顺序即dispose方法的顺序和声明顺序相反
private Circle c;
private Triangle t;
private Line[] lines = new Line[3];
//注意构造顺序->1.首先必须调用super2.按照声明的成员顺序构造(C++做法),当然也可以不按照声明顺序3.子类构造相关
public CADSystem(int i )
{
super(i + 1);
c = new Circle(1);
t = new Triangle(1);
for(int j = 0;j < lines.length;j++)
{
lines[j] = new Line(j,j * j);
}
out.println("combined constructor");
}
public void dispose()
{
out.println("CAD System dispose");
//TODO cleanup的清理顺序和初始化的顺序相反
for(int i = lines.length - 1;i >= 0;i --)
{
lines[i].dispose();
}
t.dispose();
c.dispose();
//最后调用基类的dispose方法
super.dispose();
}
public static void main(String[] args)
{
CADSystem system = new CADSystem(3);
try
{
}
finally
{
system.dispose();
}
}
}
/**
*
* 基类Shape
*
* @author landon
*
*/
class Shape
{
public Shape(int i)
{
out.println("Shape Constructor");
}
void dispose()
{
out.println("Shape Dispose");
}
}
/**
*
* Circle,继承Shape
*
构造的时候,首先调用了基类的构造函数;dispose的时候,首先调用自己的方法,最后调用基类的dispose方法
*
* @auth