1. <ul id="0c1fb"></ul>

      <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
      <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区

      RELATEED CONSULTING
      相關(guān)咨詢
      選擇下列產(chǎn)品馬上在線溝通
      服務(wù)時間:8:30-17:00
      你可能遇到了下面的問題
      關(guān)閉右側(cè)工具欄

      新聞中心

      這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
      Java中的內(nèi)部類怎么學(xué)習(xí)

      這篇文章的內(nèi)容主要圍繞Java中的內(nèi)部類怎么學(xué)習(xí)進行講述,文章內(nèi)容清晰易懂,條理清晰,非常適合新手學(xué)習(xí),值得大家去閱讀。感興趣的朋友可以跟隨小編一起閱讀吧。希望大家通過這篇文章有所收獲!

      為柳北等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計制作服務(wù),及柳北網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為成都網(wǎng)站建設(shè)、網(wǎng)站建設(shè)、柳北網(wǎng)站設(shè)計,以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達到每一位用戶的要求,就會得到認(rèn)可,從而選擇與我們長期合作。這樣,我們也可以走得更遠(yuǎn)!

      看了很多源碼,都有用到內(nèi)部類,但是自己以前在生產(chǎn)環(huán)境上,用的確實少,也有用過但是很少,所以今天就打算好好的把它從頭到尾的過一遍。

      定義

      可以將一個類的定義放在里另一個類的內(nèi)部,這就是內(nèi)部類,所謂的內(nèi)部類的概念只是出現(xiàn)在編譯階段,對于jvm層是沒有內(nèi)部類這個概念的。我們可以利用內(nèi)部類來解決

      •  類的單繼承問題,外部類不能再繼承的類可以交給內(nèi)部類繼承

      •  我們可以通過定義內(nèi)部類來實現(xiàn)一個類私屬于一個類,實現(xiàn)更好的封裝性

      •  代碼優(yōu)化:它需要更少的代碼

      分類

      內(nèi)部類可以分為:

      •  靜態(tài)內(nèi)部類。

      •  非靜態(tài)內(nèi)部類。

      非靜態(tài)內(nèi)部類又可以分為:

      •  成員內(nèi)部類。

      •  方法內(nèi)部類。

      •  匿名內(nèi)部類。

      靜態(tài)內(nèi)部類

      我感覺這個是用的最多的,你比如說redis的key的設(shè)計, 因為我們要中間拼接:號,所以用靜態(tài)內(nèi)部類去組成不同的key是非常好的,這樣可以讓相同類型的key在同一個文件目錄下

      Java中的內(nèi)部類怎么學(xué)習(xí)

      靜態(tài)內(nèi)部類的定義和普通的靜態(tài)變量或者靜態(tài)方法的定義方法是一樣的,使用static關(guān)鍵字,只不過這次static是修飾在class上的,一般而言,只有靜態(tài)內(nèi)部類才允許使用static關(guān)鍵字修飾,普通類的定義是不能用static關(guān)鍵字修飾的,這一點需要注意一下。

      下面定義一個靜態(tài)內(nèi)部類:

      public class Out {      private static String name;      private int age;      public static class In{          private int age;          public void sayHello(){              System.out.println("my name is : "+name);              //--編譯報錯---              //System.out.println("my age is :"+ age);          }      }  }

      在上述代碼中,In這個類就是一個靜態(tài)內(nèi)部類。我們說內(nèi)部類是可以訪問外部類的私有字段和私有方法的,對于靜態(tài)內(nèi)部類,它遵循一致的原則,只能訪問外部類的靜態(tài)成員。

      上述代碼中,外部類的非靜態(tài)私有字段age在靜態(tài)內(nèi)部類中是不允許訪問的,而靜態(tài)字段name則是可訪問的。下面我們看,如何創(chuàng)建一個靜態(tài)內(nèi)部類的實例對象。

      public static void main(String [] args){      Out.In innerClass = new Out.In();      innerClass.sayHello();  }

      使用場景,一般來說,對于和外部類聯(lián)系緊密但是并不依賴于外部類實例的情況下,可以考慮定義成靜態(tài)內(nèi)部類。下面我們看稍顯復(fù)雜的成員內(nèi)部類。

      成員內(nèi)部類

      我們說了,四種不同類型的內(nèi)部類都各自有各自的使用場景,靜態(tài)內(nèi)部類適合于那種和外部類關(guān)系密切但是并不依賴外部類實例的情況。但是對于需要和外部類實例相關(guān)聯(lián)的情況下,可以選擇將內(nèi)部類定義成成員內(nèi)部類。

      以下代碼定義了一個簡單的成員內(nèi)部類:

      public class Out {      private String name;      public void showName(){          System.out.println("my name is : "+name);      }      public class In{          public void sayHello(){              System.out.println(name);              Out.this.showName();          }      }  }

      以上定義了一個簡單的內(nèi)部類In,我們的成員內(nèi)部類可以直接訪問外部類的成員字段和成員方法,因為它是關(guān)聯(lián)著一個外部類實例的。下面我們看看在外部是如何創(chuàng)建該內(nèi)部類實例的。

      public static void main(String [] args){      Out out = new Out();      out.setName("六脈神劍")      Out.In in = out.new In();      in.sayHello();  }

      因為成員內(nèi)部類是關(guān)聯(lián)著一個具體的外部類實例的,所以它的實例創(chuàng)建必然是由外部類實例來創(chuàng)建的。

      對于實例的創(chuàng)建,我們只需要記住即可,成員內(nèi)部類的實例創(chuàng)建需要關(guān)聯(lián)外部類實例對象,靜態(tài)內(nèi)部類實例創(chuàng)建相對簡單。下面我們主要看看在編譯階段編譯器是如何保持內(nèi)部類對外部類成員信息可訪問的。

      使用場景,對于那種要高度依賴外部類實例的情況下,定義一個成員內(nèi)部類則會顯的更加明智。

      方法內(nèi)部類

      方法內(nèi)部類,顧名思義,定義在一個方法內(nèi)部的類。方法內(nèi)部類相對而言要復(fù)雜一些,下面定義一個方法內(nèi)部類:

      public class Out {      private String name;      public void sayHello(){          class In{              public void showName(){                  System.out.println("my name is : "+name);              }          }          In in = new In();          in.showName();      }  }

      我們定義了一個類,在該類中又定義了一個方法sayHello,然而在該方法中我們定義了一個內(nèi)部類,類In就是一個方法內(nèi)部類。我們的方法內(nèi)部類的生命周期不超過包含它的方法的生命周期,也就是說,方法內(nèi)部類只能在方法中使用。所以在聲明的時候,任何的訪問修飾符都是沒有意義的,于是Java干脆不允許使用任何的訪問修飾符修飾方法內(nèi)部類。

      其中還需要注意一點的是,定義和使用時兩回事,別看那一大串定義類的代碼,你實際想要使用該類,就必須new對象,而對于方法內(nèi)部類而言,只能在方法內(nèi)部new對象。這就是方法內(nèi)部類的簡單介紹,下面我們看看其實現(xiàn)原理。

      有關(guān)方法內(nèi)部類的實現(xiàn)原理其實是和成員內(nèi)部類差不太多的,也是在內(nèi)部類初始化的時候為其傳入一個外部類實例,區(qū)別在哪呢?就在于方法內(nèi)部類是定義在具體方法的內(nèi)部的,所以該類除了可以通過傳入的外部實例訪問外部類中的字段和方法,對于包含它的方法中被傳入的參數(shù)也會隨著外部類實例一起初始化給內(nèi)部類。

      毋庸置疑的是,方法內(nèi)部類的封裝性比之前介紹的兩種都要完善。所以一般只有在需要高度封裝的時候才會將類定義成方法內(nèi)部類。

      匿名內(nèi)部類

      可能內(nèi)部類的所有分類中,匿名內(nèi)部類的名號是最大的,也是我們最常用到的,多見于函數(shù)式編程,lambda表達式等。下面我們重點看看這個匿名內(nèi)部類。

      匿名內(nèi)部類就是沒有名字的內(nèi)部類,在定義完成同時,實例也創(chuàng)建好了,常常和new關(guān)鍵字緊密結(jié)合。當(dāng)然,它也不局限于類,也可以是接口,可以出現(xiàn)在任何位置。

      下面我們定義一個匿名內(nèi)部類:

      如果您必須重寫類或接口的方法,則應(yīng)該使用它。可以通過兩種方式創(chuàng)建Java匿名內(nèi)部類

      //首先定義一個普通類  public class Out {      private String name;      public void sayHello(){          System.out.println("my name is :" + name);      }  }

      ~

      //定義和使用一個匿名內(nèi)部類  public static void main(String [] args){      Out out = new Out(){          @Override          public void sayHello(){              System.out.println("my name is cyy");          }          public void showName(){              System.out.println("hello single");          }      };      out.sayHello();  }

      從上述代碼中可以很顯然的讓我們看出來,我們的匿名內(nèi)部類必定是要依托一個父類的,因為它是沒有名字的,無法用一個具體的類型來表示。所以匿名內(nèi)部類往往都是通過繼承一個父類,重寫或者重新聲明一些成員來實現(xiàn)一個匿名內(nèi)部類的定義。實際上還是利用了里式轉(zhuǎn)換原理。

      其實在看了上述三種內(nèi)部類的原理之后,反而覺得匿名內(nèi)部類的實現(xiàn)較為簡單了。主要思路還是將內(nèi)部類抽離出來,通過初始化傳入外部類的實例以達到對外部類所有成員的訪問。只是在匿名內(nèi)部類中,被依托的父類不是他的外部類。

      匿名內(nèi)部類的主要特點在于,沒有名字,對象只能被使用一次,可以出現(xiàn)在任意位置。所以它的使用場景也是呼之欲出,對于一些對代碼簡潔度有所要求的情況下,可首選匿名內(nèi)部類。

      感謝你的閱讀,相信你對“Java中的內(nèi)部類怎么學(xué)習(xí)”這一問題有一定的了解,快去動手實踐吧,如果想了解更多相關(guān)知識點,可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站!小編會繼續(xù)為大家?guī)砀玫奈恼拢?/p>
      新聞標(biāo)題:Java中的內(nèi)部類怎么學(xué)習(xí)
      URL鏈接:http://ef60e0e.cn/article/ppgpih.html

      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区
      1. <ul id="0c1fb"></ul>

        <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
        <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

        蒙阴县| 昭觉县| 疏附县| 宁河县| 翁牛特旗| 长宁县| 温泉县| 江津市| 昂仁县| 诏安县| 濮阳县| 利辛县| 沂源县| 扎兰屯市| 安陆市| 绿春县| 敖汉旗| 额济纳旗| 德江县| 门源| 武汉市| 沙河市| 图木舒克市| 马山县| 西平县| 福安市| 宿迁市| 江川县| 华亭县| 巫山县| 清流县| 安国市| 盐津县| 彰化县| 台南市| 沾化县| 高青县| 靖边县| 武冈市| 五指山市| 通州区|