java 复用类

复用代码是Java众多引人注目的功能之一。但是想成为极具革命性的语言,仅仅能够复制代码并对之加以改变时不够的,它还必须能够做更多的事情。

上述方法常为c这类过程型语言所使用,但收效并不是很好。正如Java中所有事物一样,问题解决都是围绕着类展开的。可以通过创建新类来复用代码,而不必再从头开始编写。可以使用别人业已开发并调试好的类。

此方法的窍门在于使用类而不破坏现有程序代码。有两种可以达到这一目的的方法。第一种方法非常直观:只需在新的类中产生现有类的对象。由于新的类是由现有类的对象组成,所以这种方法称为组合。该方法只是复用了现有程序代码的功能,而非它的形式。

第二种方法则更细致一些,它按照现有类的类型来创建新类。无需改变现有类的形式,采用现有类的形式并在其中添加新的代码。这种神奇的方式称为继承,而且编译器可以完成其中大部分工作。继承是面向对象程序设计的基石之一。


Java确保正确清理

Java里没有C++中析构函数的概念。析构函数是一种在对象被销毁时可以被自动调用的函数。其原因可能是因为在java中,我们的习惯只是忘记而不是销毁对象,并且让垃圾回收器在必要时释放其内存。

通常这样做是好事,但有时类可能要在其生命周期内执行一些必需的清理活动。你并不知道垃圾回收器何时将会被调用,或者它是否将被调用。因此,如果你想要某个类清理一些东西,就必需显式地编写一个特殊方法来做这件事,并要确保客户端程序员知晓他们必须要调用这一方法。其首要任务就是,必须将这一清理动作置于finally子句之中,以防异常的出现。

请看下面这个能在屏幕上绘制图案的计算机辅助设计系统示例:

public class Shape {

Shape(int i){System.out.println("Shape constructor");}

void dispose(){System.out.println("Shape dispose");}

}


public class Circle extends Shape{
Circle(int i) {
super(i);
// TODO Auto-generated constructor stub
System.out.println("Drawing Circle");
}

void dispose(){
System.out.println("Erasing Circle");
super.dispose();
}
}


public class Triangle extends Shape{


Triangle(int i) {
super(i);
// TODO Auto-generated constructor stub
System.out.println("Drawing Triangle");
}

void dispose(){
System.out.println("Erasing Triangle");
super.dispose();
}


}




public class Line extends Shape{
private int start,end;
Line(int start, int end) {
super(start);
// TODO Auto-generated constructor stub
this.start = start;
this.end = end;
System.out.println("Drawing Line: "+start +", "+end);
}


void dispose(){
System.out.println("Erasing Line: "+start+", "+end);
super.dispose();
}
}


public class CADSystem extends Shape{


private Circle c;
private Triangle t;
private Line[] lines = new Line[3];
CADSystem(int i) {
super(i+1);
// TODO Auto-generated constructor stub
for(int j = 0; j < lines.length; j++ ){
lines[j] = new Line(j,j*j);
c= new Circle(1);
t = new Triangle(1);
System.out.println("Combing construction");
}
}



public void dispose(){
System.out.println("CADSystem dispoae()");
t.dispose();
c.dispose();
for(int i = lines.length; i >=0; i--){
lines[i].dispose();
}
super.dispose();
}

public static void main(String[] args){
CADSystem x = new CADSystem(47);
try{

}finally{
x.dispose();
}
}
}


此系统中的一切都是某种Shape(Shape自身就是一种Object, 因为Shape继承自根类Object)。每个类都覆写Shape的dispose()方法,并运用super来调用该方法的基类版本。尽管生命期中任何被调用的方法都可以做一些必需的清理工作,但是Circle,Triangle和Line这些特定的Shape类仍然都带有可以“绘制”的构造器。每个类都有自己的dispose()方法将为存于内存之中的东西恢复到对象存在之前的状态。

在清理方法dispose()中,还必须注意对基类清理方法和成员对象清理方法的调用顺序,以防某个子对象依赖于另一个子对象情形的发生。一般而言,所采用的形式应该与c++编译器在其析构函数上所施加的形式相同:首先,执行类的所有特定的清理动作,其顺序同生成顺序相反;然后,调用基类的清理方法。

许多情况下,清理并不是问题,仅需让垃圾回收器完成该动作就行。但当必须亲自处理时,就得多做努力并多加小心。因为,一旦涉及垃圾回收,能够信赖的事就不会很多了。垃圾回收起可能永远也无法被调用,即使被调用,它也可能以任何它想要的顺序来回收对象。最好的办法是除了内存以外,不能依赖垃圾回收器去做任何事。如果需要进行清理,最好是编写你自己的清理方法,但不要使用finalize().


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值