欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

Java內部類的用法有哪些?

這篇文章主要為大家詳細介紹了Java內部類的用法,文中示例代碼介紹的非常詳細,零基礎也能參考此文章,感興趣的小伙伴們可以參考一下。

專業(yè)從事成都做網(wǎng)站、網(wǎng)站建設、外貿營銷網(wǎng)站建設,高端網(wǎng)站制作設計,小程序定制開發(fā),網(wǎng)站推廣的成都做網(wǎng)站的公司。優(yōu)秀技術團隊竭力真誠服務,采用H5頁面制作+CSS3前端渲染技術,自適應網(wǎng)站建設,讓網(wǎng)站在手機、平板、PC、微信下都能呈現(xiàn)。建站過程建立專項小組,與您實時在線互動,隨時提供解決方案,暢聊想法和感受。

內部類(inner class)是定義在另一個類內部的類。之所以定義在內部是因為內部類有一些普通類沒有的“特權”,可以方便實現(xiàn)一些需求。

內部類

先來看一個簡單的例子:

public class Apple {
    private int size = 16;
    private class Book {
        public void print() {
            System.out.println(size);
        }
    }

}

Book類就是定義在Apple類中的一個內部類,Book類引用了Apple類的私有域size卻沒有報錯,這就是上文提到的特權了,內部類可以引用外圍類的所有域和方法包括私有的。那么為什么內部類可以做到這樣神奇的事情呢?原來是編譯器在背后偷偷干的好事!

把上文的例子編譯后可以看到編譯器會額外生成一個Apple$Book.class文件:

class Apple$Book {
    private Apple$Book(Apple var1) {
        this.this$0 = var1;
    }

    public void print() {
        System.out.println(Apple.access$000(this.this$0));
    }
}

可以看到這個類的名稱是用外圍類名稱加內部類名稱用$符號分割,而且編譯器在內部類的構造函數(shù)里自動添加了一個外圍類的參數(shù),這樣內部類就能引用到外圍類的域和參數(shù)了。

不過這樣還有一個問題,我們完全可以按普通的方式自己寫一個構建方式來接收Apple類而不用內部類的方式,不過這樣的類卻無法引用Apple類的私有域和私有方法。

眼尖的同學可能已經(jīng)發(fā)現(xiàn)奧秘了,Apple.access$000(this.this$0)這一條語句就是關鍵了。內部類在引用外圍類的私有域和方法時編譯器會在外圍類內部生成一個靜態(tài)方法access$XXX,這個方法會返回外圍類的私有域或調用私有方法,方法的第一個參數(shù)是外圍類的引用。

不過這樣就有了安全風險,任何人都可以通過調用Apple.access$000方法很容易地讀取到私有域size。當然,access$000不是Java的合法方法名。但熟悉類文件結構的黑客可以使用十六進制編輯器輕松地創(chuàng)建一個用虛擬機指令調用那個方法的類文件。由于隱秘地訪問方法需要擁有包可見性,所以攻擊代碼需要與被攻擊類放在同一個包中。

特殊的語法

內部類有一些特殊的語法,比如獲取傳入的外圍類引用的語法是OuterClass.this,外圍類的類名加上this關鍵字。還有明確的使用內部類的構建函數(shù)outerObject.new InnerClass {construction parameters)。在內部類中聲明的靜態(tài)域必須是不可變的,即必須用final修飾符修飾,且不能有靜態(tài)方法。例子:

public class Apple {

    private int size = 16;

    private class Book {
        public void print() {
            System.out.println(Apple.this.size);
        }
    }

    public static void main(String[] args) {
        Apple apple = new Apple();
        Apple.Book book = apple.new Book();
    }

}

局部內部類

內部類也可以在一個方法內聲明,這樣定義的內部類就是局部內部類。局部內部類和內部類的區(qū)別在于局部內部類的作用域局限于定義它的方法塊內,除了這個方法內部局部內部類都是不可見的。

public class Apple {

    private int size = 16;

    private void print() {
        class Book {
            public void print() {
                System.out.println(size);
            }
        }
        Book book = new Book();
        book.print();
    }

}

匿名內部類

顧名思義,匿名內部類是一種沒有類名的類。因為有時候我們只需要有一個一次性使用的類的對象,匿名內部類可以方便我們實現(xiàn)。通常的語法格式為:

SuperType superType = new SuperType(construction parameters) {
    inner class methods and data
}

如果SuperType是一個接口,那么就需要在大括號里實現(xiàn)接口定義的抽象方法。如果SuperType是一個類,可以在大括號里擴展這個類。因為匿名內部類沒有類名,所以是不能定義構建函數(shù)的。在Java8以后,使用lambda表達式會比匿名內部類更加方便。

雙括號初始化

利用匿名內部類的特殊語法的特殊初始化技巧,比如初始化一個數(shù)組:

List<String> arrayList = new ArrayList<String>() {{
    add("test");
    add("test2");
}};

不過就這個例子來說這樣更好:List<String> arrayList = Arrays.asList("test", "test2");

靜態(tài)內部類

上文說到內部類都會有一個外圍類的引用,不過有時我們只是想把類放在另一個類內部并不需要引用它,這時就可以用到靜態(tài)內部類。例子:

public class Apple {

    private int size;

    private int price;

    public Apple(int size, int price) {
        this.size = size;
        this.price = price;
    }

    public static void main(String[] args) {
        Apple apple = AppleBuilder.builder().setPrice(20).setSize(16).build();
    }

    static class AppleBuilder {

        private int size;

        private int price;

        static AppleBuilder builder() {
            return new AppleBuilder();
        }

        Apple build() {
            return new Apple(size, price);
        }

        AppleBuilder setSize(int size) {
            this.size = size;
            return this;
        }

        AppleBuilder setPrice(int price) {
            this.price = price;
            return this;
        }
    }
}

以上就是Java內部類的詳細內容,代碼示例簡單明了,如果在日常工作遇到此問題。通過這篇文章,希望你能有所收獲,更多詳情敬請關注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

分享文章:Java內部類的用法有哪些?
轉載來源:http://aaarwkj.com/article28/pcoscp.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供商城網(wǎng)站、品牌網(wǎng)站設計、Google網(wǎng)站設計、企業(yè)網(wǎng)站制作、自適應網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

營銷型網(wǎng)站建設
美国一级黄片在线观看| 最新国产情侣夫妻激情| 亚洲国模av一区二区三区| 一区二区三区欧美日韩在线| 亚洲国产精品福利在线| av在线播放网址网站| 色伊人久久综合中文字幕| 亚洲乱人伦一区二区三区| 日本韩国欧美一区二区在线| 真人国产一级美女免费视频| 伊人激情久久综合中文字幕| 欧美精品青青久久久久久| 欧美亚洲另类日韩综合网| 婷婷激情六月中文字幕| 亚洲性码不卡视频在线| 一区二区三区日韩激情| 欧美亚洲国产青草久久| 欧美伊香蕉久久综合网99| 亚洲中文字幕在线不卡| 日韩有码高清av在线| 成年人午夜在线观看网址| 欧美日韩国产成人激情| 日韩欧美精品在线不卡| 69人妻一区二区三区蜜桃| 欧美日韩国产亚洲免费| 欧美亚洲清纯唯美另类| 宅男午夜一区二区三区| 人妻操人人妻中出av| 久久久久亚洲av成人| 国产成人亚洲一区二区三区| 天天干夜夜泡天天操| 亚洲精品一区av在线观看| 国产日韩一区二区三区电影| 欧美日韩综合在线第一页| 日本高清av一区二区| 久久久久久精品国产av| 亚洲男人天堂超碰在线| 人妖系列中文字幕欧美系列| 综合久久精品亚洲天堂| 亚洲一区二区三区av蜜桃| 中文日本强暴人妻另类视频|