正儿八经的详细讲java内部类
咳咳咳!!!!!
博主真的是正兒八經(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)部類對象
外部類名.內(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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java位运算实例详解——(amp;)、
- 下一篇: 小朋友你是否对java中的static满