Java接口之抽象类和方法

[来源] 达内    [编辑] 达内   [时间]2012-10-30

抽象类能够更加明确地将类的共同点抽象出来,同时告知编译器和用户它的使用接口。抽象类也是重构的有效方法,能够将共同的方法抽象到类层级的顶层

 在继承关系中,有些时候基类中的方法是没有实际意义的,它的 存在仅仅是为了像一系列的派生类提供接口而已,此时基类中的方法不能具有现实的应用意义,可以通过在基类的方法中抛出错误来方法对基类中接口的调用,但是这样需要在运营时才能报错,此时就需要使用抽象类和抽象方法来实现继承关系。

  抽象方法只有方法的声明,没有方法体,包含一个或多个抽象方法的类必 是抽象类。编译器不允许定义抽象类的实例,否则会报错,从而保证了抽象类的正确使用。如果通过继承抽象类来创建派生类,那么派生类必须实现抽象类中所有的抽象方法,否则,这个派生类也必须是抽象的。此时编译器会强制你在派生类前面加上abstract关键字。

  可以创建一个派生类而不包含任何抽象方法。适用于的场合是你不想让这个类有任何的实例,同时也不适合在这个类中放置任何抽象方法。创建一个抽象类并不代表这这个类中的所有方法都必须为抽象方法。

//
: interfaces/music4/Music4.java 
//

 Abstract classes and methods.

package interfaces.music4; 
import polymorphism.music.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( "Wind.play() " + n);   }    public String what() { return "Wind"; }    public void adjust() {} } class Percussion extends Instrument {    public void play(Note n) {     print( "Percussion.play() " + n);   }    public String what() { return "Percussion"; }    public void adjust() {} } class Stringed extends Instrument {   public void play(Note n) {     print( "Stringed.play() " + n);   }    public String what() { return "Stringed" ; }   public void adjust() {} } class Brass extends Wind {    public void play(Note n) {     print( "Brass.play() " + n);   }    public void adjust() { print("Brass.adjust()"); } } class Woodwind extends Wind {    public void play(Note n) {     print( "Woodwind.play() " + 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) {      // ...     i.play(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: Wind.play() MIDDLE_C Percussion.play() MIDDLE_C Stringed.play() MIDDLE_C Brass.play() MIDDLE_C Woodwind.play() MIDDLE_C *///:~

  抽象类能够更加明确地将类的共同点抽象出来,同时告知编译器和用户它的使用接口。抽象类也是重构的有效方法,能够将共同的方法抽象到类层级的顶层

资源下载