接口,內部類,抽象類概念和區別


1. 接口

接口為我們提供了一種將接口與實現分離的更加結構化的方法。接口是一個完全的抽象類,它沒有提供任何形式的具體實現,它允許創建者確定方法名,參數類表,返回類型沒有任何方法體的方法。

 

接口被用來建立類與類之間的協議。接口類修飾符必須是public,default(默認的,本包內有訪問權限)或者前邊兩個和abstract組合,接口也可以包含域,但是這些域隱士地是public static final類型的,所有接口域必須初始化值。接口中方法默認訪問級別都是public,如果定義訪問級別小於public,編譯將不能通過。

 

接口是用來實現類間多重繼承功能的結構.
接口不能實例化,即不能用new運算符創建對象。
一個類通過使用關鍵字implements聲明自己實現一個或多個接口。
在類體中可以使用接口中定義的常量,而且必須實現接口中定義的所有方法
接口中的方法是自動公有的,在實現接口時必須把方法聲明為public 。接口中的方法都是抽象的。

 

一個接口可以繼承另一個接口。

任何類(包括普通類,內部類,抽象類)可以實現一個接口。

2. 抽象類

抽象類也叫做抽象基類,抽象類是基礎類和接口中間的一個中庸之道,即有基礎類特性(已實現的方法體),又有接口特性(抽象方法),抽象類用abstract修飾,抽象類中可以有抽象方法也用abstract來修飾。

 

抽象方法:java 中可以定義一些不含方法體的方法,它的方法體的實現交給該類的子類根據自己的情況去實現。
抽象類:包含抽象方法的類叫抽象類。一個抽象類可以有一個或多個抽象方法。

 

抽象類必須使用abstract修飾符來定義,抽象方法也必須用abstract來修飾。
抽象類不能被實例化,不能用new關鍵字去產生對象。
抽象方法只能聲明,不能實現。
含有抽象方法的類必須被聲明為抽象類,抽象類的子類必須覆蓋所有的抽象方法后才能被實例化,否則這個子類還是個抽象類。

3. 內部類

可以將一個類的定義放在另一個類的定義內部,這就是內部類,內部類允許你把一些邏輯相關的類組織在一起,並控制內部類的可視性,內部類和組合是完全不同的概念,這點要注意。

 

最初,內部類看起來就是一種類隱藏機制,將類置於其他類的內部,但是其實內部類用途遠遠不止這些,它可以和外部類進行通信,而且你用內部類寫出的代碼更加優美清晰。

 

定義:在一個類內部定義類
內部類的寫法:class 類名{ } 
它可以直接訪問和引用他的外部類的所有變量和方法,與外部類相比,內部類可以聲明為private或protected.

 

用static修飾一個內部類時(嵌套類),這個類相當於是一個外部定義的類,所以static的內部類中可聲明static成員
static內部類不能使用外部類的非static成員變量

函數的局部變量(形參也是局部變量),內部類的成員變量,外部類的成員變量重名,用以下方式來明確指定我們真正要訪問的變量。

 

public class Outer {
    
    private int size;
 
    class Inner {
        
        private int size;
 
        public void doStuff(int size) {
            size++; // 引用的是doStuff函數的形參
            this.size++; // 引用的是Inner類中的成員變量
            Outer.this.size++; // 引用的Outer類中的成員變量
        }
    }
}

內部類如何被外部類引用?

內部類可以通過創建對象從外部類之外被調用,只要將內部類聲明為public

public class Outer {
 
    private int size;
 
    class Inner {
 
        private int size;
 
        public void doStuff(int size) {
            size++; // 引用的是doStuff函數的形參
            this.size++; // 引用的是Inner類中的成員變量
            Outer.this.size++; // 引用的Outer類中的成員變量
        }
    }
 
    public static void main(String[] args) {
        Outer outer = new Outer();
        Outer.Inner inner = outer.new Inner();
        inner.doStuff(1);
    }
}

方法中定義內部類?

內部類並非只能在類里定義,也可以在幾個程序塊的范圍之內定義內部類。例如在方法或for循環體內部,均可以.
在方法中定義的內部類只能訪問方法中的final類型的局部變量。

    public void testClassInMethod(final String arg) {
        
        class ClassInMethod {
            
            void test() {
                System.out.println(arg);
            }
        }
    }

匿名內部類?

只需要為局部內部類建立一個對象,不必為該類指定一個名字。

public Inner testAnonyClassInMethod() {
    
    return new Inner() { // 此處為一個匿名類定義,沒有類名,意思為創建一個繼承自Inner內部類的對象
        
        @Override
        public void doStuff(int size) {
            super.doStuff(size);
        }
    };
}

抽象類和接口的區別與聯系。

一個類可以實現多個接口, 而一個類只能繼承一個抽象類。
接口只定義方法,實現一個接口就是要實現接口的所有方法。而抽象類可以實現部分方法。
多個無關的類可以實現同一個接口,一個類可以實現多個無關的接口

轉自:http://www.pianshen.com/article/213371794/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM