日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長提供免費收錄網(wǎng)站服務,提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

1分鐘帶你看懂Java內(nèi)部類

 

1.為什么使用內(nèi)部類?

使用內(nèi)部類最吸引人的原因是:每個內(nèi)部類都能獨立地繼承一個(接口的)實現(xiàn),所以無論外圍類是否已經(jīng)繼承了某個(接口的)實現(xiàn),

對于內(nèi)部類都沒有影響

1.1.使用內(nèi)部類最大的優(yōu)點就在于它能夠非常好的解決多重繼承的問題,使用內(nèi)部類還能夠為我們帶來如下特性:

(1)、內(nèi)部類可以用多個實例,每個實例都有自己的狀態(tài)信息,并且與其他外圍對象的信息相互獨。

(2)、在單個外圍類中,可以讓多個內(nèi)部類以不同的方式實現(xiàn)同一個接口,或者繼承同一個類。

(3)、創(chuàng)建內(nèi)部類對象的時刻并不依賴于外圍類對象的創(chuàng)建。

(4)、內(nèi)部類并沒有令人迷惑的“is-a”關(guān)系,他就是一個獨立的實體。

(5)、內(nèi)部類提供了更好的封裝,除了該外圍類,其他類都不能訪問。

2.內(nèi)部類分類:

(一).成員內(nèi)部類:

public class Outer{
 private int age = 99;
 String name = "Coco";
 public class Inner{
 String name = "Jayden";
 public void show(){
 System.out.println(Outer.this.name);
 System.out.println(name);
 System.out.println(age);
 }
 }
 public Inner getInnerClass(){
 return new Inner();
 }
 public static void main(String[] args){
 Outer o = new Outer();
 Inner in = o.new Inner();
 in.show();
 }
 }

1.Inner 類定義在 Outer 類的內(nèi)部,相當于 Outer 類的一個成員變量的位置,Inner 類可以使用任意訪問控制符,如 public 、 protected 、 private 等

2.Inner 類中定義的 show() 方法可以直接訪問 Outer 類中的數(shù)據(jù),而不受訪問控制符的影響,如直接訪問 Outer 類中的私有屬性age

3.定義了成員內(nèi)部類后,必須使用外部類對象來創(chuàng)建內(nèi)部類對象,而不能直接去 new 一個內(nèi)部類對象, 即:內(nèi)部類 對象名 = 外部類對象.new 內(nèi)部類( );

4.編譯上面的程序后,會發(fā)現(xiàn)產(chǎn)生了兩個 .class 文件: Outer.class,Outer$Inner.class{}

5.成員內(nèi)部類中不能存在任何 static 的變量和方法,可以定義常量:

(1).因為非靜態(tài)內(nèi)部類是要依賴于外部類的實例,而靜態(tài)變量和方法是不依賴于對象的,僅與類相關(guān)。簡而言之:在加載靜態(tài)域時,根本沒有外部類,所以在非靜態(tài)內(nèi)部類中不能定義靜態(tài)域或方法,編譯不通過; 非靜態(tài)內(nèi)部類的作用域是實例級別

(2).常量是在編譯器就確定的,放到所謂的常量池了

★★友情提示:

1.外部類是不能直接使用內(nèi)部類的成員和方法的,可先創(chuàng)建內(nèi)部類的對象,然后通過內(nèi)部類的對象來訪問其成員變量和方法;

2.如果外部類和內(nèi)部類具有相同的成員變量或方法,內(nèi)部類默認訪問自己的成員變量或方法,如果要訪問外部類的成員變量,

可以使用 this 關(guān)鍵字,如:Outer.this.name

(二).靜態(tài)內(nèi)部類: 是 static 修飾的內(nèi)部類,

1.靜態(tài)內(nèi)部類不能直接訪問外部類的非靜態(tài)成員,但可以通過 new 外部類().成員 的方式訪問

2.如果外部類的靜態(tài)成員與內(nèi)部類的成員名稱相同,可通過“類名.靜態(tài)成員”訪問外部類的靜態(tài)成員;

如果外部類的靜態(tài)成員與內(nèi)部類的成員名稱不相同,則可通過“成員名”直接調(diào)用外部類的靜態(tài)成員

3.創(chuàng)建靜態(tài)內(nèi)部類的對象時,不需要外部類的對象,可以直接創(chuàng)建 內(nèi)部類 對象名 = new 內(nèi)部類();

public class Outer{
 private int age = 99;
 static String name = "Coco";
 public static class Inner{
 String name = "Jayden";
 public void show(){
 System.out.println(Outer.name);
 System.out.println(name); 
 }
 }
 public static void main(String[] args){
 Inner i = new Inner();
 i.show();
 }
 }

(三).方法內(nèi)部類

其作用域僅限于方法內(nèi),方法外部無法訪問該內(nèi)部類

(1).局部內(nèi)部類就像是方法里面的一個局部變量一樣,是不能有 public、protected、private 以及 static 修飾符的

(2).只能訪問方法中定義的 final 類型的局部變量,因為:

當方法被調(diào)用運行完畢之后,局部變量就已消亡了。但內(nèi)部類對象可能還存在, 直到?jīng)]有被引用時才會消亡。此時就會出現(xiàn)一種情況,就是內(nèi)部類要訪問一個不存在的局部變量; ==>使用final修飾符不僅會保持對象的引用不會改變, 而且編譯器還會持續(xù)維護這個對象在回調(diào)方法中的生命周期.

局部內(nèi)部類并不是直接調(diào)用方法傳進來的參數(shù),而是內(nèi)部類將傳進來的參數(shù)通過自己的構(gòu)造器備份到了自己的內(nèi)部,

自己內(nèi)部的方法調(diào)用的實際是自己的屬性而不是外部類方法的參數(shù);

防止被篡改數(shù)據(jù),而導致內(nèi)部類得到的值不一致

/*
 使用的形參為何要為 final???
 在內(nèi)部類中的屬性和外部方法的參數(shù)兩者從外表上看是同一個東西,但實際上卻不是,所以他們兩者是可以任意變化的,
 也就是說在內(nèi)部類中我對屬性的改變并不會影響到外部的形參,而然這從程序員的角度來看這是不可行的,
 畢竟站在程序的角度來看這兩個根本就是同一個,如果內(nèi)部類該變了,而外部方法的形參卻沒有改變這是難以理解
 和不可接受的,所以為了保持參數(shù)的一致性,就規(guī)定使用 final 來避免形參的不改變
 */
 public class Outer{
 public void Show(){
 final int a = 25;
 int b = 13;
 class Inner{
 int c = 2;
 public void print(){
 System.out.println("訪問外部類:" + a);
 System.out.println("訪問內(nèi)部類:" + c);
 }
 }
 Inner i = new Inner();
 i.print();
 }
 public static void main(String[] args){
 Outer o = new Outer();
 o.show();
 }
 }

(3).注意:在JDK8版本之中,方法內(nèi)部類中調(diào)用方法中的局部變量,可以不需要修飾為 final,匿名內(nèi)部類也是一樣的,主要是JDK8之后增加了 Effectively final 功能

http://docs.oracle.com/JAVAse/tutorial/java/javaOO/localclasses.html

反編譯jdk8編譯之后的class文件,發(fā)現(xiàn)內(nèi)部類引用外部的局部變量都是 final 修飾的

(四).匿名內(nèi)部類:

(1).匿名內(nèi)部類是直接使用 new 來生成一個對象的引用;

(2).對于匿名內(nèi)部類的使用它是存在一個缺陷的,就是它僅能被使用一次,創(chuàng)建匿名內(nèi)部類時它會立即創(chuàng)建一個該類的實例,

該類的定義會立即消失,所以匿名內(nèi)部類是不能夠被重復使用;

(3).使用匿名內(nèi)部類時,我們必須是繼承一個類或者實現(xiàn)一個接口,但是兩者不可兼得,同時也只能繼承一個類或者實現(xiàn)一個接口;

(4).匿名內(nèi)部類中是不能定義構(gòu)造函數(shù)的,匿名內(nèi)部類中不能存在任何的靜態(tài)成員變量和靜態(tài)方法;

(5).匿名內(nèi)部類中不能存在任何的靜態(tài)成員變量和靜態(tài)方法,匿名內(nèi)部類不能是抽象的,它必須要實現(xiàn)繼承的類或者實現(xiàn)的接口的所有抽象方法

(6).匿名內(nèi)部類初始化:使用構(gòu)造代碼塊!利用構(gòu)造代碼塊能夠達到為匿名內(nèi)部類創(chuàng)建一個構(gòu)造器的效果。

public class OuterClass {
 public InnerClass getInnerClass(final int num,String str2){
 return new InnerClass(){
 int number = num + 3;
 public int getNumber(){
 return number;
 }
 }; /* 注意:分號不能省 */
 }
 public static void main(String[] args) {
 OuterClass out = new OuterClass();
 InnerClass inner = out.getInnerClass(2, "chenssy");
 System.out.println(inner.getNumber());
 }
 }
 interface InnerClass {
 int getNumber();
 }

最后,感謝你看完了這篇文章,

分享到:
標簽:部類 Java
用戶無頭像

網(wǎng)友整理

注冊時間:

網(wǎng)站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨大挑戰(zhàn)2018-06-03

數(shù)獨一種數(shù)學游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數(shù)有氧達人2018-06-03

記錄運動步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定