正儿八经的详细讲java内部类
咳咳咳!!!!!
博主真的是正兒八經的人,但是是不是正兒八經的講就不知道了
目錄:
1.成員內部類
2.局部內部類
3.匿名內部類
4.靜態內部類
5.內部類的優點
6.內部類的優點
1.成員內部類:
1.概念:
定義在類的內部,成員位置上的非靜態類
例子:
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.關于成員內部類的主意點:
1.成員內部類可以訪問外部類的所有變量和方法,包括靜態和非靜態,私有和公有的
2.內部類和外部類是兩個獨立的類,運行時會各自生成自己的.class文件
3.內部類相當于外部類的一個成員變量,可以用public,private等修飾符修飾(平時正常的類只能被public或默認的default修飾)
4.成員內部類不能有靜態方法屬性和靜態初始化塊
5.內部類的實例化對象一定是綁定在外部類的實例上,存在外部類對象才有內部類對象(你總不能沒媳婦就有兒子了吧)
6.要調用內部類的方法就必須通過實例的內部類對象
外部類名.內部類名 自定義內部類引用=外部類實例.new 內部類();
outer o=new outer();outer.inner p=o.new inner();p.visit();2.局部內部類:
(2).概念:
定義在方法中的內部類,就是局部內部類
例子:
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)局部內部類的注意事項:
1.定義在實例方法中的局部內部類可以訪問外部類所有變量和方法
2.定義在靜態方法中的局部類只能訪問外部類的靜態變量和方法
3.方法內部類只能在方法內部使用
4.由于方法內部類只能在所在的方法內部使用所以不能用訪問控制符和static修飾
5.匿名內部類訪問局部變量的時候,必須聲明為 final(最后會提)
(3)局部內部類的創建和正常類一樣
public static void testStaticFunctionClass(){class Inner {}Inner inner = new Inner();}3.匿名內部類:
1.概念:
匿名內部類就是沒有名字的內部類,日常開發中使用的比較多
(2)使用匿名內部類的前提:
1.使用匿名內部類必須繼承一個父類(可以是抽象類還可以是正常修飾符修飾的類)或者實現一個接口,但是最多只能繼承一個父類或者一個接口)
2.匿名內部類沒有構造器(連名字都沒有哪來的構造器),
3.匿名內部類不是抽象類(創建一個匿名內部類的時候會立刻創建一個匿名內部類的對象,抽象類哪有實例化對象之說,而且抽象類是有構造器的)
(3)例子1(實現接口):
public class Outer {private void test(final int i) {new Service() {public void method() {for (int j = 0; j < i; j++) {System.out.println("匿名內部類" );}}}.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);//加上會報錯,因為創建的是一個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)匿名內部類的注意事項:
1.匿名內部類不能定義任何靜態成員和靜態方法
2.匿名內部類訪問局部變量的時候,必須聲明為 final(最后會提)
3.只能創建一個實例
(5)匿名內部類創建方式:
new 類/接口{ //匿名內部類實現部分 }4.靜態內部類:
(1).概念:
定義在類內部的靜態類就叫靜態內部類
例子:
public class Outer {private static int radius = 1;static class StaticInner {public void visit() {System.out.println("visit outer static variable:" + radius);}} }(2)注意事項:
只能訪問外部類所有的靜態變量
(3)創建方法:
靜態內部類名 對象名=new 靜態內部類();5.內部類的優點
我們為什么要使用內部類呢?因為它有以下優點:1.一個內部類對象可以訪問創建它的外部類對象的內容,包括私有數據!
2.內部類不為同一包的其他類所見,具有很好的封裝性;
3.內部類有效實現了“多重繼承(并不是真的多重繼承,而是由于它既能訪問外部類的屬性還能訪問自己繼承的類的屬性,有著一類包含多類的效果)”,優化 java 單繼承的缺陷。
4.匿名內部類可以很方便的定義回調。
6.內部類有哪些應用場景
1.一些多算法場合
2.解決一些非面向對象的語句塊。
3.當某個類除了它的外部類,不再被其他的類使用時。
最后就是局部內部類和匿名內部類訪問局部變量的時候,為什么變量必須要加上final?
先看這段代碼:
public class Outer {void outMethod(){final int a =10;class Inner {void innerMethod(){System.out.println(a);}}} }以上例子,為什么要加final呢?
是因為生命周期不一致, 局部變量直接存儲在棧中,當方法執行結束后,非final的局部變量就被銷毀。而局部內部類對局部變量的引用依然存在(這里你創建的內部類還在堆空間里沒被銷毀所以引用還在),如果局部內部類要調用局部變量時,就會出錯。加了final,可以確保局部內部類使用的變量與外層的局部變量區分開
總結
以上是生活随笔為你收集整理的正儿八经的详细讲java内部类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java位运算实例详解——(amp;)、
- 下一篇: 小朋友你是否对java中的static满