Java的知识点14——内部类的概念、内部类的分类
內部類的概念
?一般情況,我們把類定義成獨立的單元。有些情況下,我們把一個類放在另一個類的內部定義,稱為內部類(innerclasses)。
內部類可以使用public、default、protected 、private以及static修飾。
外部頂級類(我們以前接觸的類)只能使用public和default修飾。
注:內部類只是一個編譯時概念,一旦我們編譯成功,就會成為完全不同的兩個類。對于一個名為Outer的外部類和其內部定義的名為Inner的內部類。編譯完成后會出現Outer.class和Outer$Inner.class兩個類的字節碼文件。所以內部類是相對獨立的一種存在,其成員變量/方法名可以和外部類的相同。
內部類介紹
package cn.dym05;class Outer{private int age=10;public void show() {System.out.println(age);}public class Inner{//內部類中可以聲明與外部類同名的屬性與方法private int age=20;public void show() {System.out.println(age);}} }public class Test01 {public static void main(String[] args) {} }內部類的作用:
? ? ??1. 內部類提供了更好的封裝。只能讓外部類直接訪問,不允許同一個包中的其他類直接訪問。
? ? ??2. 內部類可以直接訪問外部類的私有屬性,內部類被當成其外部類的成員。 但外部類不能訪問內部類的內部屬性。
? ? ??3. 接口只是解決了多重繼承的部分問題,而內部類使得多重繼承的解決方案變得更加完整。
內部類的使用場合:
? ? ??1. 由于內部類提供了更好的封裝特性,并且可以很方便的訪問外部類的屬性。所以,在只為外部類提供服務的情況下可以優先考慮使用內部類。
? ? ??2. ?使用內部類間接實現多繼承:每個內部類都能獨立地繼承一個類或者實現某些接口,所以無論外部類是否已經繼承了某個類或者實現了某些接口,對于內部類沒有任何影響。
內部類的分類
?在Java中內部類主要分為成員內部類(非靜態內部類、靜態內部類)、匿名內部類、局部內部類
成員內部類(可以使用private、default、protected、public任意進行修飾。 類文件:外部類$內部類.class)
非靜態內部類(外部類里使用非靜態內部類和平時使用其他類沒什么不同)
? ? ? i. 非靜態內部類必須寄存在一個外部類對象里。因此,如果有一個非靜態內部類對象那么一定存在對應的外部類對象。非靜態內部類對象單獨屬于外部類的某個對象。
? ? ??ii. 非靜態內部類可以直接訪問外部類的成員,但是外部類不能直接訪問非靜態內部類成員。
? ? ??iii. 非靜態內部類不能有靜態方法、靜態屬性和靜態初始化塊。
? ? ??iv. 外部類的靜態方法、靜態代碼塊不能訪問非靜態內部類,包括不能使用非靜態內部類定義變量、創建實例。
成員變量訪問要點:
? ? ? ??1. 內部類里方法的局部變量:變量名。
? ? ? ??2. 內部類屬性:this.變量名。
? ? ? ??3. 外部類屬性:外部類名.this.變量名。
內部類的訪問
package cn.dym05;class Outer{private int age=10;class Inner{int age=20;public void show() {int age=30;System.out.println("內部類方法里的局部變量age:"+age); //30System.out.println("內部類的成員變量age:"+this.age);//20System.out.println("外部類的成員變量age:"+Outer.this.age); //10 }} }public class Test02 {public static void main(String [] args) {//先創建外部類實例,然后使用該外部類實例創建內部類實例Outer.Inner inner=new Outer().new Inner();inner.show();Outer outer=new Outer();Outer.Inner inn=outer.new Inner();inn.show();} }//先創建外部類實例,然后使用該外部類實例創建內部類實例?
靜態內部類
?使用要點:
? ? ? ?1. 當一個靜態內部類對象存在,并不一定存在對應的外部類對象。 因此,靜態內部類的實例方法不能直接訪問外部類的實例方法。
? ? ? ?2. 靜態內部類看做外部類的一個靜態成員。 因此,外部類的方法中可以通過:“靜態內部類.名字”的方式訪問靜態內部類的靜態成員,通過 new 靜態內部類()訪問靜態內部類的實例。
?
靜態內部類的訪問
靜態內部類相當于外部類的一個靜態成員,通過?new?外部類名.內部類名()?來創建內部類對象
package cn.dym05;class Outer{private int age=10;static class Inner{int age=20;public void show() {int age=30;System.out.println("內部類方法里的局部變量age:"+age); //30System.out.println("內部類的成員變量age:"+this.age);//20//System.out.println("外部類的成員變量age:"+Outer.this.age); //不能訪問 }} }public class Test02 {public static void main(String [] args) {//通過 new 外部類名.內部類名() 來創建內部類對象Outer.Inner inner=new Outer.Inner();inner.show();} }匿名內部類
? ? ? 匿名內部類適合那種只需要使用一次的類。比如:鍵盤監聽操作等等
注:1. 匿名內部類沒有訪問修飾符。
? ? ? ?2. 匿名內部類沒有構造方法。因為它連名字都沒有那又何來構造方法呢。
局部內部類
還有一種內部類,它是定義在方法內部的,作用域只限于本方法,稱為局部內部類。
方法中的內部類
package cn.dym05;public class Test04 {public void show() {//作用域僅限于該方法class Inner{public void fun() {System.out.println("helloworld");}}new Inner().fun();}public static void main(String[] args) {new Test04().show();} }總結
以上是生活随笔為你收集整理的Java的知识点14——内部类的概念、内部类的分类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java的知识点13——多态、对象的转型
- 下一篇: Java的知识点16——数组概述和特点、