天天看點

抽象類和接口的基本概念

       抽象類實際上也是一個類,隻是與之前的普通類相比,在抽象類中多了抽象方法。

       抽象方法是隻聲明而未實作的方法,所有的抽象方法必須使用abstract關鍵字聲明,包含抽象方法的類也必須使用abstract class聲明。

一個抽象類的定義

abstract class A{

         private String name = "WWW" ;

         public void fun(){

                   // 此處定義了一個普通方法

                   System.out.println("Hello World!!!") ;

         }

         <b>public abstract void print() ;</b>

};

       可以發現抽象方法後面沒有“{}”,則表示方法沒有實作。

       如果對抽象方法直接執行個體化,則會出現無法執行個體化的錯誤。

         public abstract void print() ;

public class Demo01{

         public static void main(String args[]){

                   <b>A a = new A() ;</b>

<b>抽象類的使用原則:</b>

       1、  抽象類必須有子類,抽象類必須被繼承

       2、  抽象類的子類如果不是抽象類的話,則必須覆寫裡面的全部抽象方法。

       3、  抽象類不能直接執行個體化,必須依靠子類完成。

進一步完善之前的程式:

class B extends A{

         // 覆寫抽象方法

         public void print(){

                   System.out.println("**********************") ;

public class Demo02{

                   B b = new B() ;

                   b.print() ;

                   b.fun() ;

<b>讨論問題:</b>

       1、  能否用final修飾一個抽象類呢?

              · 因為抽象類必須被子類繼承,而被final修飾的類不能有子類。是以不能

       2、  抽象類中能否有構造方法呢?可以有

abstract class Person{

         private String name ;

         private int age ;

         // 單獨按一個類來說,應該可以直接在構造方法中初始化

<b>         public Person(String name,int age){</b>

<b>                   this.name = name ;</b>

<b>                   this.age = age ;</b>

<b>         }</b>

         public abstract String getInfo() ;

         public String getName(){

                   return this.name ;

         public int getAge(){

                   return this.age ;

class Student extends Person{

         private String school ;

         public Student(String name,int age,String school){

                   <b>super(name,age) ;</b>

                   this.school = school ;

         public String getInfo(){

                   return "姓名:"+super.getName()+",年齡:"+super.getAge()+",學校:"+this.school ;

public class Demo03{

                   Student stu = new Student("張三",30,"北京大學") ;

                   System.out.println(stu.getInfo()) ;

抽象類中可以有構造方法,但是要求在沒有無參構造方法的時候,子類必須明确的調用父類中的構造方法。

<b>回顧:</b>子類對象的執行個體化過程

· 子類對象執行個體化的時候預設會先去調用父類中的無參構造方法,如果父類中沒有無參構造,則可以通過super指定調用父類中的其他構造方法。

<b>注意:</b>

       一個類隻可以繼承一個抽象類,屬于單繼承。

<b>       </b><b>接口定義:</b>

              · 隻包含抽象方法和全局常量的類稱為接口。

              · 接口使用interface進行定義。

interface A{

         public static final String INFO = "HELLO" ;

}

       接口定義完之後,一個接口也必須依靠其子類使用,子類繼承接口的概念稱為實作。格式如下:

              class 子類 implements 接口名稱{}

       接口的子類如果不是抽象類的話,則也必須覆寫裡面的全部抽象方法。

class B implements A{

                   System.out.println(INFO) ;

public class Demo04{

       接口與抽象類相比,有一個優點:說一個子類隻能繼承一個父類,但是可以同時實作多個接口,也就說是通過接口完成多繼承。

       class 子類 implements 接口A,接口B

interface C{

         public static final String PARAM = "WWW" ;

         public abstract void fun() ;

class B implements A,C{

                   System.out.println(PARAM) ;

public class Demo05{

       <b>問題:</b>

既然,接口中的一切方法都是抽象方法,接口中的一切變量都是全局常量,那麼實際上接口就可以簡化成如下的形式定義。

         // public static final String INFO = "HELLO" ;

         String INFO = "HELLO" ;

         // public abstract void print() ;

         void print() ;     //à 此處雖然沒有明确的寫出權限,但實際上權限是<b>public</b>

       一定要明确:接口中的一切方法都是public通路權限,是以在子類實作方法的時候通路權限必須是public。寫與不寫是一樣的。是以有時候為了避免此種情況,還是建議寫上:public

         <b>public void print() ;</b>

       那麼如果一個類繼承繼承一個抽象類又要實作一個接口,則必須按照以下格式完成:

       class 子類 extends 父類(一般都是抽象類) implements 接口A,接口B

         void print() ;

abstract class X{

         public String param = "hello" ;

         abstract void fun() ;

class B extends X implements A{

         void fun(){

                   System.out.println(param) ;

public class Demo07{

<b> </b>

<b>開發原則:</b>

       在開發中一定要記住,一個類往往很少去繼承一個已經實作好的類,即:普通類之間不能互相繼承。

<b>注意點:</b>

       1、  一個抽象類可以實作多個接口,但是一個接口不能繼承一個抽象類。

<b>abstract class X implements A</b>{

       2、  一個接口可以同時繼承多個接口,即:實作多繼承關系

              interface 子接口 extends 父接口A,父接口B,父接口C

         public void printA() ;

interface B{

         public void printB() ;

         public void printC() ;

interface X extends A,B,C{

         public void printX() ;

class Y implements X{

         public void printA(){}

         public void printB(){}

         public void printC(){}

本文轉自 李興華 51CTO部落格,原文連結:http://blog.51cto.com/lixinghua/91243,如需轉載請自行聯系原作者

繼續閱讀