JAVA 內部類的簡單總結

來源:互聯網
上載者:User

定義在一個類內部的類叫內部類,包含內部類的類稱為外部類。內部類可以聲明public、protected、private等訪問限制,可以聲明為abstract的供其他內部類或外部類繼承與擴充,或者聲明為static、final的,也可以實現特定的介面。static的內部類行為上象一個獨立的類,非static在行為上類似類的屬性或方法且禁止聲明static的方法。內部類可以訪問外部類的所有方法與屬性,但static的內部類只能訪問外部類的靜態屬性與方法。

外部類按常規的類訪問方式使用內部類,唯一的差別是外部類可以訪問內部類的所有方法與屬性,包括私人方法與屬性。如:
        pinner p = new pinner();
        p.index = 20;
        p.Print();
        ---- 這種方式適合外部類的非static方法;

        pouter po = new pouter();
        pinner pi = po.new pinner();
        pi.index = 40;
        pi.Print();
        ---- 這種方式適合外部類的static方法;

內部類類似外部類的屬性,因此訪問內部類對象時總是需要一個建立好的外部類對象。內部類對象通過‘外部類名.this.xxx’的形式訪問外部類的屬性與方法。如:
            System.out.println("Print in inner Outer.index=" + pouter.this.index);
            System.out.println("Print in inner Inner.index=" + this.index);

如果需要在其他類中訪問內部類,可以使用:
(1)外部類提供建立內部類的方法供其他類使用。如:
        // 外部類
        pinner getInner()
        {
            return new pinner();
        }

        // 其他類
        pouter.pinner pi = po.getInner();
        pi.Print();

(2)直接建立內部類的對象。如:
        pouter po = new pouter();
        pouter.pinner pi = po.new pinner();
        pi.Print();

內部類可以聲明在外部類的方法中或語句塊中。如果內部類需要訪問包含它的外部類方法或語句塊的局部變數或參數,則該局部變數或參數必須是final的。外部類的其他方法、其他類無法訪問聲明在方法內部或塊內部的內部類。

如果一個類繼承內部類,則建立該類的對象時需提供一個外部類的對象作為構造方法的參數。如:
class Car
{
    class Wheel
    {

    }
}

class SuperWheel extends Car.Wheel
{
    SuperWheel(Car car)
    {
        car.super();
    }

    public static void main(String [] args)
    {
        Car car = new Car();
        SuperWheel wl = new SuperWheel(car);
    }
}

如果建立命名的內部類沒有多少實際意義時,可以建立匿名的內部類。比如使用內部類實現介面的功能(如事件處理器、適配器等),而功能的差異較大,需要根據實際的情況建立相應的內部類時,可以使用匿名內部類。簡單的樣本如下:
interface WebView
{
    void doGet();
}

class A
{
    WebView ShowName()
    {
        return new WebView()
        {
            void doGet()
            {
                System.out.println("Name");
            }    
        };
    }

    WebView ShowCode()
    {
        return new WebView()
        {
            void doGet()
            {
                System.out.println("Code");
            }    
        };
    }
}

最後,JAVA 內部類還有一個作用,那就是實現JAVA的多繼承。JAVA本身是不允許多繼承的,如果我們想一個類繼承多個基類,就可以使用內部類。通過內部類分別繼承一個基類,外部類建立內部類的對象,並使用內部類的方法,變相地實現了多繼承。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.