Java接口之抽象类和方法

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

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

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

< p style="margin: 10px auto; padding: 0px; text-indent: 0px; line-height: 19px; color: rgb(0, 0, 0); font-size: 13px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: 2; text-align: left; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: rgb(254, 254, 242); ">   抽象方法只有方法的声明,没有方法体,包含一个或多个抽象方法的类必 是抽象类。编译器不允许定义抽象类的实例,否则会报错,从而保证了抽象类的正确使用。如果通过继承抽象类来创建派生类,那么派生类必须实现抽象类中所有的抽象方法,否则,这个派生类也必须是抽象的。此时编译器会强制你在派生类前面加上abstract关键字。

< p style="margin: 10px auto; padding: 0px; text-indent: 0px; line-height: 19px; color: rgb(0, 0, 0); font-size: 13px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: 2; text-align: left; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: rgb(254, 254, 242); ">   可以创建一个派生类而不包含任何抽象方法。适用于的场合是你不想让这个类有任何的实例,同时也不适合在这个类中放置任何抽象方法。创建一个抽象类并不代表这这个类中的所有方法都必须为抽象方法。

< div style="margin: 5px 0px; padding: 5px; background-color: rgb(245, 245, 245); font-family: 'Courier New'; font-size: 12px; border: 1px solid rgb(204, 204, 204); overflow: auto; color: rgb(0, 0, 0); font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; " class="cnblogs_code">
//
: 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 *///:~
< p style="margin: 10px auto; padding: 0px; text-indent: 0px; line-height: 19px; color: rgb(0, 0, 0); font-size: 13px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: 2; text-align: left; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: rgb(254, 254, 242); ">   抽象类能够更加明确地将类的共同点抽象出来,同时告知编译器和用户它的使用接口。抽象类也是重构的有效方法,能够将共同的方法抽象到类层级的顶层

资源下载