Java接口之抽象类和方法
[来源] 达内 [编辑] 达内 [时间]2012-10-30
抽象类能够更加明确地将类的共同点抽象出来,同时告知编译器和用户它的使用接口。抽象类也是重构的有效方法,能够将共同的方法抽象到类层级的顶层
在继承关系中,有些时候基类中的方法是没有实际意义的,它的 存在仅仅是为了像一系列的派生类提供接口而已,此时基类中的方法不能具有现实的应用意义,可以通过在基类的方法中抛出错误来方法对基类中接口的调用,但是这样需要在运营时才能报错,此时就需要使用抽象类和抽象方法来实现继承关系。
抽象方法只有方法的声明,没有方法体,包含一个或多个抽象方法的类必 是抽象类。编译器不允许定义抽象类的实例,否则会报错,从而保证了抽象类的正确使用。如果通过继承抽象类来创建派生类,那么派生类必须实现抽象类中所有的抽象方法,否则,这个派生类也必须是抽象的。此时编译器会强制你在派生类前面加上abstract关键字。
可以创建一个派生类而不包含任何抽象方法。适用于的场合是你不想让这个类有任何的实例,同时也不适合在这个类中放置任何抽象方法。创建一个抽象类并不代表这这个类中的所有方法都必须为抽象方法。
// : interfaces/music4/ // Abstract classes and methods. package interfaces.music4; import .Note; import static net.mindview.util.Print.*; abstract class Instrument { private int i; // Storage allocated for each public abstract void play(Note n); public String what() { return "Instrument"; } public abstract void adjust();
} class Wind extends Instrument { public void play(Note n) { print( "() " + n); } public String what() { return "Wind"; } public void adjust() {} } class Percussion extends Instrument { public void play(Note n) { print( "() " + n); } public String what() { return "Percussion"; } public void adjust() {} } class Stringed extends Instrument { public void play(Note n) { print( "() " + n); } public String what() { return "Stringed" ; } public void adjust() {} } class Brass extends Wind { public void play(Note n) { print( "() " + n); } public void adjust() { print("Brass.adjust()"); } } class Woodwind extends Wind { public void play(Note n) { print( "() " + n); } public String what() { return "Woodwind"; } } public class Music4 { // Doesn’t care about type, so new types // added to the system still work right: static void tune(Instrument i) { // ... (Note.MIDDLE_C); } static void tuneAll(Instrument[] e) { for (Instrument i : e) tune(i); } public static void main(String[] args) { // Upcasting during addition to the array: Instrument[] orchestra = { new Wind(), new Percussion(), new Stringed(), new Brass(), new Woodwind() }; tuneAll(orchestra); } } /* Output: () MIDDLE_C () MIDDLE_C () MIDDLE_C () MIDDLE_C () MIDDLE_C *///:~
抽象类能够更加明确地将类的共同点抽象出来,同时告知编译器和用户它的使用接口。抽象类也是重构的有效方法,能够将共同的方法抽象到类层级的顶层