繼承與接口(二)

接口

         Java語言不支持一個類有多個直接的父類(多繼承),但可以實現(implements)多個接口,間接的實現了多繼承.

         接口使用有幾點需要注意的:

         1、Java接口與c++的純虛基類類似。成員變量默認都是public,static,final類型的(都可省略),必須被顯示初始化,即接口中的成員變量爲常量(大寫,單詞之間用"_"分隔)

2, Java接口中的方法默認都是public,abstract類型的(都可省略),沒有方法體,不能被實例化

下面都是不對的。

複製代碼
 1 public interface A  
 2 
 3   {  
 4 
 5    int var; //錯,var是常量,必須顯示初始化   
 6 
 7    void method(){...};   //錯,接口中只能包含抽象方法  
 8 
 9    protected void method2(); //錯,接口中的方法必須是public類型  
10 
11    static void method3(){...};   //錯,接口中不能包含靜態方法  
12 
13   }
複製代碼

我個人以爲,接口就是一個純抽象類,只有抽象方法,堅決不能有實現。實現接口即是在給自己的類添加一個或多個方法。使用接口是爲了在設計模式上的規範。

抽象類與接口區別

         這個我還是推薦看看http://www.blogjava.net/chunkyo/archive/2007/01/21/95093.html。講的非常好,只是不知道原創是誰。

參考:

詳論JAVA對象的初始化過程 http://peixun.it168.com/showart.php?id=97  

Java 中深層理解父類引用指向子類對象 http://hi.baidu.com/startym/blog/item/c6e9073ec3c417d67d1e71a3.html

Java抽象類和接口的區別 http://www.blogjava.net/chunkyo/archive/2007/01/21/95093.html

C++的虛基類與Java的多態性 http://akai.yo2.cn/articles/c的虛基類與java的多態性.html

JavaC++在面象對象基本概念上的區分 http://blog.csdn.net/adcxf/article/details/2072009

Java接口學習筆記 http://developer.51cto.com/art/200906/130540.htm

 

1、定義接口
    使用interface來定義一個接口。接口定義同類的定義類似,也是分爲接口的聲明和接口體,其中接口體由常量定義和方法定義兩部分組成。定義接口的基本格式如下:

[修飾符] interface 接口名 [extends 父接口名列表]{

[public] [static] [final] 常量;
[public] [abstract] 方法;
}
修飾符:可選,用於指定接口的訪問權限,可選值爲public。如果省略則使用默認的訪問權限。
接口名:必選參數,用於指定接口的名稱,接口名必須是合法的Java標識符。一般情況下,要求首字母大寫。
extends 父接口名列表:可選參數,用於指定要定義的接口繼承於哪個父接口。當使用extends關鍵字時,父接口名爲必選參數。
方法:接口中的方法只有定義而沒有被實現。

例如,定義一個用於計算的接口,在該接口中定義了一個常量PI和兩個方法,具體代碼如下:

  1. public interface CalInterface   
  2. {  
  3.     final float PI=3.14159f;//定義用於表示圓周率的常量PI   
  4.     float getArea(float r);//定義一個用於計算面積的方法getArea()   
  5.     float getCircumference(float r);//定義一個用於計算周長的方法getCircumference()   
  6. }  
public interface CalInterface 
{
    final float PI=3.14159f;//定義用於表示圓周率的常量PI
    float getArea(float r);//定義一個用於計算面積的方法getArea()
    float getCircumference(float r);//定義一個用於計算周長的方法getCircumference()
}

注意:
    與Java的類文件一樣,接口文件的文件名必須與接口名相同。
實現接口
接口在定義後,就可以在類中實現該接口。在類中實現接口可以使用關鍵字implements,其基本格式如下:
[修飾符] class <類名> [extends 父類名] [implements 接口列表]{
}
修飾符:可選參數,用於指定類的訪問權限,可選值爲public、abstract和final。
類名:必選參數,用於指定類的名稱,類名必須是合法的Java標識符。一般情況下,要求首字母大寫。
extends 父類名:可選參數,用於指定要定義的類繼承於哪個父類。當使用extends關鍵字時,父類名爲必選參數。
implements 接口列表:可選參數,用於指定該類實現的是哪些接口。當使用implements關鍵字時,接口列表爲必選參數。當接口列表中存在多個接口名時,各個接口名之間使用逗號分隔。
    在類中實現接口時,方法的名字、返回值類型、參數的個數及類型必須與接口中的完全一致,並且必須實現接口中的所有方法。例如,編寫一個名稱爲Cire的類,該類實現5.7.1節中定義的接口Calculate,具體代碼如下:

  1. public class Cire implements CalInterface   
  2. {  
  3.     public float getArea(float r)   
  4.     {  
  5.         float area=PI*r*r;//計算圓面積並賦值給變量area   
  6.         return area;//返回計算後的圓面積   
  7.     }  
  8.     public float getCircumference(float r)   
  9.     {  
  10.         float circumference=2*PI*r;      //計算圓周長並賦值給變量circumference   
  11.         return circumference;           //返回計算後的圓周長   
  12.     }  
  13.     public static void main(String[] args)   
  14.     {  
  15.         Cire c = new Cire();  
  16.         float f = c.getArea(2.0f);  
  17.         System.out.println(Float.toString(f));  
  18.     }  
  19. }  
public class Cire implements CalInterface 
{
    public float getArea(float r) 
    {
        float area=PI*r*r;//計算圓面積並賦值給變量area
        return area;//返回計算後的圓面積
    }
    public float getCircumference(float r) 
    {
        float circumference=2*PI*r;      //計算圓周長並賦值給變量circumference
        return circumference;           //返回計算後的圓周長
    }
    public static void main(String[] args) 
    {
        Cire c = new Cire();
        float f = c.getArea(2.0f);
        System.out.println(Float.toString(f));
    }
}

      在類的繼承中,只能做單重繼承,而實現接口時,一次則可以實現多個接口,每個接口間使用逗號“,”分隔。這時就可能出現常量或方法名衝突的情況,解決該問題時,如果常量衝突,則需要明確指定常量的接口,這可以通過“接口名.常量”實現。如果出現方法衝突時,則只要實現一個方法就可以了。下面通過一個具體的實例詳細介紹以上問題的解決方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章