天天看點

Java接口,抽象類,内部類

當年面試的時候就被問過這個問題,今天在論壇上看到這個文章總結,順手就轉過來了。

原帖位址:http://topic.csdn.net/u/20100312/10/822B0E94-8D2F-4BF0-9746-3424EAEA40CE.html

1.接口(interface),接口被用來建立類與類之間關聯的标準。

Java code
public
     
    interface
     ITest{
      
    public
     
    void
     test();
}

    public
     
    class
     TestImpl 
    implements
     ITest{
      
    public
     
    void
     test(){
             System.out.println(
    "
    test
    "
    );
      }
}
   
      

2.抽象類(abstract class),隻要類中有一個抽象方法,此類就被标記為抽象類。實際上抽象類除了被繼承之外沒有任何意義。

差別

1.

接口是公開(public)的,裡面不能有私有的方法或變量,是用于讓别人使用的,實作接口的一定要實作接口裡定義的所有方法。

而抽象類是可以有私有方法或私有變量的,實作抽象類可以有選擇地重寫需要用到的方法,但是必須實作裡面所有的抽象方法。

2.

抽象類在 Java 語言中表示的是一種繼承關系,一個類隻能使用一次繼承關系。

但是,一個類卻可以實作多個interface(java中實作多重繼承的方法之一)。

3.

抽象類中可以有自己的資料成員,也可以有非abstarct的成員方法。

而在接口中,隻能夠有靜态的不能被修改的資料成員(也就是必須是 static final的,不過在 interface中一般不定義資料成員),而且所有的成員方法都是抽象的。

4.

抽象類和接口所反映出的設計理念不同。

其實abstract class表示的是"is-a"關系,interface表示的是"like-a"關系。(組合是"has a"關系)

5.

接口中定義的變量預設是public static final 型,且必須給其初值,是以實作類中不能重新定義,也不能改變其值。

抽象類中的變量預設是 friendly 型,其值可以在子類中重新定義,也可以重新指派。

一般的應用裡,最頂級的是接口,然後是抽象類實作接口,最後才到具體類實作。不是很建議具體類直接實作接口的。還有一種設計模式是面向接口程式設計,而非面向實作程式設計。

其實接口是抽象類的延伸,可以将它看做是純粹的抽象類,就是說接口比抽象類還抽象,還有設計接口的目的就是為了實作C++中的多重繼承,不過java團隊設計的一樣更有趣的東西來實作這個功能,那就是内部類(inner class)。

内部類(inner class)

Java code
public
     
    class
     OuterClass{
    //
    外部類
    

           
    private
     
    class
     InnerClass{}
    //
    内部類
    

    }
   
      

一.定義

放在一個類的内部的類我們就叫内部類。

二.作用

1.内部類可以很好的實作隐藏,也就是封裝性。一般的非内部類,是不允許有 private 與protected權限的,但内部類可以

2.内部類擁有外圍類的所有元素的通路權限

3.可是實作多重繼承(這個特點非常重要,個人認為它是内部類存在的最大理由之一)

4.可以避免修改接口而實作同一個類中兩種同名方法的調用

三.多重繼承的實作

類一  

Java code
public
       
    class
      Example1 {  
  

    public
      String getName()  {  
       
    return
       
    "
    luffyke
    "
     ;  
   }  
} 
   
      

類二  

Java code
public
       
    class
      Example2 {  
      
       
    public
       
    int
      getAge()  
       {  
            
    return
       
    25
     ;  
       }  
}  
   
      

類三

Java code
public
     
    class
     MainExample {

    
    public
     
    class
     Test1 
    extends
     Example1 {
        
    public
     String getName() {
            
    return
     
    super
    .getName();
        }
    }

    
    public
     
    class
     Test2 
    extends
     Example2 {
        
    public
     
    int
     getAge() {
            
    return
     
    super
    .getAge();
        }
    }

    
    public
     String showName() {
        
    return
     
    new
     Test1().getName();
    }

    
    public
     
    int
     showAge() {
        
    return
     
    new
     Test2().getAge();
    }

    
    public
     
    static
     
    void
     main(String args[]) {
        MainExample example 
    =
     
    new
     MainExample();
        System.out.println(
    "
    姓名:
    "
     
    +
     example.showName());
        System.out.println(
    "
    年齡:
    "
     
    +
     example.showAge());
    }
}   
   
      

大家注意看類三,裡面分别實作了兩個内部類 Test1,和Test2 ,Test1類又繼承了Example1,Test2繼承了Example2,這樣我們的類三MainExample就擁有了Example1和 Example2的方法和屬性,也就間接地實作了多繼承。

接口是子產品之間的協定,一些子產品用于實作某些協定的具體動作,另外一些子產品隻針對接口程式設計,這樣實作低耦合。

抽象類主要是用于繼承設計的,主要用于模闆設計!