日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

正儿八经的详细讲java内部类

發(fā)布時間:2024/10/14 编程问答 61 豆豆
生活随笔 收集整理的這篇文章主要介紹了 正儿八经的详细讲java内部类 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

咳咳咳!!!!!
博主真的是正兒八經(jīng)的人,但是是不是正兒八經(jīng)的講就不知道了

目錄:
1.成員內(nèi)部類

2.局部內(nèi)部類

3.匿名內(nèi)部類

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

5.內(nèi)部類的優(yōu)點

6.內(nèi)部類的優(yōu)點

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

1.概念:

定義在類的內(nèi)部,成員位置上的非靜態(tài)類

例子:

package untl1; public class outer {private static int a = 1;private int b = 2;class inner {public int c=3;public void visit() {System.out.println(a);System.out.println(b);System.out.println(c);}}public static void main(String[] args) {} }

2.關(guān)于成員內(nèi)部類的主意點:

1.成員內(nèi)部類可以訪問外部類的所有變量和方法,包括靜態(tài)和非靜態(tài),私有和公有的
2.內(nèi)部類和外部類是兩個獨立的類,運行時會各自生成自己的.class文件
3.內(nèi)部類相當(dāng)于外部類的一個成員變量,可以用public,private等修飾符修飾(平時正常的類只能被public或默認(rèn)的default修飾)
4.成員內(nèi)部類不能有靜態(tài)方法屬性和靜態(tài)初始化塊
5.內(nèi)部類的實例化對象一定是綁定在外部類的實例上,存在外部類對象才有內(nèi)部類對象(你總不能沒媳婦就有兒子了吧)
6.要調(diào)用內(nèi)部類的方法就必須通過實例的內(nèi)部類對象

(3)靜態(tài)內(nèi)部類的創(chuàng)建(銜接上邊的代碼):

外部類名.內(nèi)部類名 自定義內(nèi)部類引用=外部類實例.new 內(nèi)部類();

outer o=new outer();outer.inner p=o.new inner();p.visit();

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

(2).概念:

定義在方法中的內(nèi)部類,就是局部內(nèi)部類

例子:

package untl1; public class outer {private static int a = 1;private int b = 2;public void visit(){int c = 3;class inner {public void visit() {System.out.println(a);System.out.println(b);System.out.println(c);}}inner p1 = new inner();p1.visit();}public static void main(String[] args){int d = 4;class inner {private void fly() {System.out.println(a); // System.out.println(b); 帶上就報錯System.out.println(d);}}inner p1=new inner();p1.fly();} }

(2)局部內(nèi)部類的注意事項:

1.定義在實例方法中的局部內(nèi)部類可以訪問外部類所有變量和方法
2.定義在靜態(tài)方法中的局部類只能訪問外部類的靜態(tài)變量和方法
3.方法內(nèi)部類只能在方法內(nèi)部使用
4.由于方法內(nèi)部類只能在所在的方法內(nèi)部使用所以不能用訪問控制符和static修飾
5.匿名內(nèi)部類訪問局部變量的時候,必須聲明為 final(最后會提)

(3)局部內(nèi)部類的創(chuàng)建和正常類一樣

public static void testStaticFunctionClass(){class Inner {}Inner inner = new Inner();}

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

1.概念:

匿名內(nèi)部類就是沒有名字的內(nèi)部類,日常開發(fā)中使用的比較多

(2)使用匿名內(nèi)部類的前提:

1.使用匿名內(nèi)部類必須繼承一個父類(可以是抽象類還可以是正常修飾符修飾的類)或者實現(xiàn)一個接口,但是最多只能繼承一個父類或者一個接口)
2.匿名內(nèi)部類沒有構(gòu)造器(連名字都沒有哪來的構(gòu)造器),
3.匿名內(nèi)部類不是抽象類(創(chuàng)建一個匿名內(nèi)部類的時候會立刻創(chuàng)建一個匿名內(nèi)部類的對象,抽象類哪有實例化對象之說,而且抽象類是有構(gòu)造器的)

(3)例子1(實現(xiàn)接口):

public class Outer {private void test(final int i) {new Service() {public void method() {for (int j = 0; j < i; j++) {System.out.println("匿名內(nèi)部類" );}}}.method();}}interface Service{void method(); }

例子2(繼承類):

package untl1; abstract class A{abstract void fly(); } public class outer {private static int a = 1;private int b = 2;public static void main(String[] args) {A a= new A(){private int b=2;void fly(){System.out.println("我會單飛");}};a.fly();System.out.println(a.b);//加上會報錯,因為創(chuàng)建的是一個A的對象所以每有b這個屬性} }

想要得到b這個屬性可以用下面的這個:

package untl1; abstract class A{abstract void fly(); } public class outer {private static int a = 1;private int b = 2;public static void main(String[] args) {int c= new A(){private int b=2;void fly(){System.out.println("我會單飛");}}.b;System.out.println(c);} }

(4)匿名內(nèi)部類的注意事項:

1.匿名內(nèi)部類不能定義任何靜態(tài)成員和靜態(tài)方法
2.匿名內(nèi)部類訪問局部變量的時候,必須聲明為 final(最后會提)
3.只能創(chuàng)建一個實例

(5)匿名內(nèi)部類創(chuàng)建方式:

new/接口{ //匿名內(nèi)部類實現(xiàn)部分 }

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

(1).概念:

定義在類內(nèi)部的靜態(tài)類就叫靜態(tài)內(nèi)部類

例子:

public class Outer {private static int radius = 1;static class StaticInner {public void visit() {System.out.println("visit outer static variable:" + radius);}} }

(2)注意事項:

只能訪問外部類所有的靜態(tài)變量

(3)創(chuàng)建方法:

靜態(tài)內(nèi)部類名 對象名=new 靜態(tài)內(nèi)部類();

5.內(nèi)部類的優(yōu)點

我們?yōu)槭裁匆褂脙?nèi)部類呢?因為它有以下優(yōu)點:

1.一個內(nèi)部類對象可以訪問創(chuàng)建它的外部類對象的內(nèi)容,包括私有數(shù)據(jù)!
2.內(nèi)部類不為同一包的其他類所見,具有很好的封裝性;
3.內(nèi)部類有效實現(xiàn)了“多重繼承(并不是真的多重繼承,而是由于它既能訪問外部類的屬性還能訪問自己繼承的類的屬性,有著一類包含多類的效果)”,優(yōu)化 java 單繼承的缺陷。
4.匿名內(nèi)部類可以很方便的定義回調(diào)。

6.內(nèi)部類有哪些應(yīng)用場景

1.一些多算法場合
2.解決一些非面向?qū)ο蟮恼Z句塊。
3.當(dāng)某個類除了它的外部類,不再被其他的類使用時。

最后就是局部內(nèi)部類和匿名內(nèi)部類訪問局部變量的時候,為什么變量必須要加上final?

先看這段代碼:

public class Outer {void outMethod(){final int a =10;class Inner {void innerMethod(){System.out.println(a);}}} }

以上例子,為什么要加final呢?
是因為生命周期不一致, 局部變量直接存儲在棧中當(dāng)方法執(zhí)行結(jié)束后,非final的局部變量就被銷毀。而局部內(nèi)部類對局部變量的引用依然存在(這里你創(chuàng)建的內(nèi)部類還在堆空間里沒被銷毀所以引用還在),如果局部內(nèi)部類要調(diào)用局部變量時,就會出錯。加了final,可以確保局部內(nèi)部類使用的變量與外層的局部變量區(qū)分開

總結(jié)

以上是生活随笔為你收集整理的正儿八经的详细讲java内部类的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。