java内部类为什么会持有外部类的引用_为什么内部类持有外部类的引?
對普通類(沒有內部類的類)來說,內部類和外部類都與他無關;對有內部類的類來說,它們就是其內部類的外部類,外部類是個相對的說法,其實就是有內部類的類。所以,要回答這個問題,只需要講解內部類是什么:Java中的內部類共分為四種:靜態內部類staticinnerclass(alsocallednestedclass)成員內部類memberinnerclass局部內部類localinnerclass匿名內部類anonymousinnerclass靜態內部類StaticInnerClass最簡單的內部類形式。
類定義時加上static關鍵字。不能和外部類有相同的名字。被編譯成一個完全獨立的。class文件,名稱為OuterClass$InnerClass。class的形式。只可以訪問外部類的靜態成員和靜態方法,包括了私有的靜態成員和方法。生成靜態內部類對象的方式為:OuterClass。
InnerClassinner=newOuterClass。InnerClass();示例代碼:packagecom。learnjava。innerclass;classStaticInner{privatestaticinta=4;//靜態內部類publicstaticclassInner{publicvoidtest(){//靜態內部類可以訪問外部類的靜態成員//并且它只能訪問靜態的System。
out。println(a);}}}publicclassStaticInnerClassTest{publicstaticvoidmain(String[]args){StaticInner。Innerinner=newStaticInner。
Inner();inner。test();}}成員內部類MemberInnerClass成員內部類也是定義在另一個類中,但是定義時不用static修飾。成員內部類和靜態內部類可以類比為非靜態的成員變量和靜態的成員變量。成員內部類就像一個實例變量。
它可以訪問它的外部類的所有成員變量和方法,不管是靜態的還是非靜態的都可以。在外部類里面創建成員內部類的實例:this。newInnerclass();在外部類之外創建內部類的實例:(newOuterclass())。newInnerclass();在內部類里訪問外部類的成員:Outerclass。
this。member示例代碼:packagecom。learnjava。innerclass;classMemberInner{privateintd=1;privateinta=2;//定義一個成員內部類publicclassInner2{privateinta=8;publicvoiddoSomething(){//直接訪問外部類對象System。
out。println(d);System。out。println(a);//直接訪問a,則訪問的是內部類里的a//如何訪問到外部類里的a呢?System。out。println(MemberInner。this。a);}}}publicclassMemberInnerClassTest{publicstaticvoidmain(String[]args){//創建成員內部類的對象//需要先創建外部類的實例MemberInner。
Inner2inner=newMemberInner()。newInner2();inner。doSomething();}}局部內部類LocalInnerClass局部內部類定義在方法中,比方法的范圍還小。是內部類中最少用到的一種類型。像局部變量一樣,不能被public,protected,private和static修飾。
只能訪問方法中定義的final類型的局部變量。局部內部類在方法中定義,所以只能在方法中使用,即只能在方法當中生成局部內部類的實例并且調用其方法。示例代碼:packagecom。learnjava。innerclass;classLocalInner{inta=1;publicvoiddoSomething(){intb=2;finalintc=3;//定義一個局部內部類classInner3{publicvoidtest(){System。
out。println(HelloWorld);System。out。println(a);//不可以訪問非final的局部變量//error:Cannotrefertoanon-finalvariablebinsideaninner//classdefinedinadifferentmethod//System。
out。println(b);//可以訪問final變量System。out。println(c);}}//創建局部內部類的實例并調用方法newInner3()。test();}}publicclassLocalInnerClassTest{publicstaticvoidmain(String[]args){//創建外部類對象LocalInnerinner=newLocalInner();//調用外部類的方法inner。
doSomething();}}匿名內部類AnonymousInnerClass匿名內部類就是沒有名字的局部內部類,不使用關鍵字class,extends,implements,沒有構造方法。匿名內部類隱式地繼承了一個父類或者實現了一個接口。
匿名內部類使用得比較多,通常是作為一個方法參數。生成的。class文件中,匿名類會生成OuterClass$1。class文件,數字根據是第幾個匿名類而類推。示例代碼:packagecom。learnjava。innerclass;importjava。
util。Date;publicclassAnonymouseInnerClass{@SuppressWarnings(deprecation)publicStringgetDate(Datedate){returndate。toLocaleString();}publicstaticvoidmain(String[]args){AnonymouseInnerClasstest=newAnonymouseInnerClass();//打印日期:Stringstr=test。
getDate(newDate());System。out。println(str);System。out。println(----------------);//使用匿名內部類Stringstr2=test。getDate(newDate(){});//使用了花括號,但是不填入內容,執行結果和上面的完全一致//生成了一個繼承了Date類的子類的對象System。
out。println(str2);System。out。println(----------------);//使用匿名內部類,并且重寫父類中的方法Stringstr3=test。getDate(newDate(){//重寫父類中的方法@Override@DeprecatedpublicStringtoLocaleString(){returnHello: super。
toLocaleString();}});System。out。println(str3);}}。
全部
總結
以上是生活随笔為你收集整理的java内部类为什么会持有外部类的引用_为什么内部类持有外部类的引?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java is a_java中 is -
- 下一篇: java poi 设置公式_poi公式处