Abstract class
虽然接口的抽象层次更高一点,但是毕竟不可能你使用的全部都是interface吧,还是会碰到一些abstract class的。
abstract class就是一个类中有一个或者多个abstract method的情况,而abstract method就是没有实现只有声明的方法,留待子类去实现(子类必须实现)。
类似这样的:
public abstract class Instrument {
public Instrument() {
// TODO Auto-generated constructor stub
}
public abstract void play();
public String what() { return "Instrument"; }
public abstract void adjust();
}
其实可以这样理解:abstract class设计的目的就是提供一个统一的接口,你在使用的时候可以根据不同的子类以不同的方式(override method)表达出来,而这些subtype又继承于它从而他们用用共同的一些特性。
abstract class的对象是没有意义的,它只是一个抽象而已,真正具有意义的是它的子类。因此我们需要避免程序猿不小心new出一个abstrac object来。怎么办呢?可以让超类的所有的方法默认报错,但是这样只有在run-time使用这些方法的时候才会generate error;另一种方法就是,使用abstract method,
即如果这个类中含有abstract method的话,编译器会在compile-time的时候就阻止你new出abstract object,而拥有abstract method的类必须也声明为abstract才可以,即abstract class。
public class Wind extends Instrument {
public Wind() {
// TODO Auto-generated constructor stub
}
@Override
public void play() {
System.out.println("wind.play().");
}
@Override
public void adjust() {
// TODO Auto-generated method stub
}
@Override
public String what(){ return "Wind"; }
}
子类必须实现超类的方法,即specified。这样子类的实例就具有了自己特殊的意义了,而超类只是一个接口。就像你用Instrucment表达所有的乐器,但是这个含义太广泛了,而Wind就特指一种乐器了,它有自己发弹奏的方法了。
如果你想new一个abstrac object呢?编译器会给你一种选择,就是“当场"实现其中的abstract method,像下面这样,这样的嵌套可能会让你不是很舒服,不过它确实是对的:
Instrument i = new Instrument() {
@Override
public void play() {
// TODO Auto-generated method stub
}
@Override
public void adjust() {
// TODO Auto-generated method stub
}
};
。。。