<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Java:雙括號初始化 /匿名內部類初始化法

      偶然見到一種初始化方式,感到十分新奇:

          //新建一個列表并賦初值A、B、C
          ArrayList<String> list = new ArrayList<String>() {{
              add("A");
              add("B");
              add("C");
          }};

      還有其他集合比如HashMap的初始化:

          Map map = new HashMap() {{ 
            put("Name", "Unmi"); 
            put("QQ", "1125535"); 
          }};

      這種方式比起先new出對象,再一條條add,顯得更加簡潔和優雅。一開始沒想通什么原理,后來查了一下才知道這種方法被稱為雙大括號初始化(double brace initialization)或者匿名內部類初始化法,實際上是一種取巧的方式。

      理解:

      這里以ArrayList的例子解釋,首先第一層花括號定義了一個繼承于ArrayList的匿名內部類 (Anonymous Inner Class)

      //定義了一個繼承于ArrayList的類,它沒有名字
      new ArrayList<String>(){
        //在這里對這個類進行具體定義
      };

      第二層花括號實際上是這個匿名內部類實例初始化塊 (Instance Initializer Block)(或稱為非靜態初始化塊):

      new ArrayList<String>(){
        {
          //這里是實例初始化塊,可以直接調用父類的非私有方法或訪問非私有成員
        }
      };

      我們通過new得到這個ArrayList的子類的實例并向上轉型為ArrayList的引用:

       ArrayList<String> list = new ArrayList<String>() {{}};
      • 我們得到的實際上是一個ArrayList的子類的引用,雖然這個子類相比ArrayList并沒有任何功能上的改變。
      • 可以認為這是個本身裝有數據的子類(因為它的數據來自于自身的初始化),而不是取得引用后再賦值。

      下面自定義一個類并使用這種方式初始化:

      class Person{
        protected String name;
        protected int age;
      
        public String getName() {
          return name;
        }
        public void setName(String name) {
          this.name = name;
        }
        public int getAge() {
          return age;
        }
        public void setAge(int age) {
          this.age = age;
        }
      }
      ...
      public static void main(String[] args) {
        Person p = new Person(){
          {
            name = "xiaoming";  //或者調用setName()
            age = 3;          //或者setAge()
          }
        };
        System.out.println(p.getName() + p.getAge());
      }

      注意:

      (1)這種方法一定程度上使代碼更簡潔,但同時可能降低可讀性;還可能會造成內存泄露,在序列化時可能也會出現一些問題(未測試)。

      (2)當我們想構造一個數組列表,并將它傳遞到一個方法時,最初的寫法如下:

      ArrayList<String>  friends=new ArrayList<>();

      friends.add("tom");

      friends.add("lin");

      invite(friends);

      如果不想要寫這個數組列表,可將其作為一個匿名列表,通過雙括號的方式為列表添加元素,這樣代碼更為簡潔。

      invite(new ArrayList<String> ()

      {

           {

                   add("tom");

                   add("lin");

                  }

      })

      外層“{}”創建了ArrayLIst的一個匿名子類,內層“{}”創建了一個對象構造塊。

      posted on 2017-09-15 10:26  云瀟灑  閱讀(8607)  評論(3)    收藏  舉報

      導航

      主站蜘蛛池模板: 久久天天躁狠狠躁夜夜2020老熟妇| 久久精品国产99国产精品严洲 | 亚洲国产精品久久久久秋霞影院| 人妻中文字幕av资源站| 亚州av第二区国产精品| 精品人妻伦九区久久aaa片| 成人亚洲精品一区二区三区| 深夜av在线免费观看| 国产成人免费ā片在线观看| 狠狠色丁香婷婷综合久久来来去| 国产成人高清精品亚洲| 欧美最猛黑人xxxx | 国产精品美女www爽爽爽视频| 人妻久久久一区二区三区| 日本中文字幕不卡在线一区二区| 免费国产精品黄色一区二区| 中文字幕人妻中出制服诱惑 | 国产亚洲欧美日韩俺去了| 97se亚洲综合在线天天| 亚洲不卡一区三区三区四| 少妇性l交大片| 黄色一级片一区二区三区| 少妇xxxxx性开放| 在线 欧美 中文 亚洲 精品| 九九热精彩视频在线免费| 国产小视频一区二区三区| 国产无遮挡猛进猛出免费| 狠狠色丁香婷婷综合| 精品嫩模福利一区二区蜜臀| 亚洲尤码不卡av麻豆| 青青国产揄拍视频| 日韩在线视频线观看一区| 国色天香中文字幕在线视频| 国产乱码日产乱码精品精| 少妇又爽又刺激视频| 亚洲一区二区精品极品| 亚洲制服无码一区二区三区| 国产精品综合一区二区三区| 浴室人妻的情欲hd三级国产| 木兰县| 日韩av日韩av在线|