標籤:string 類的變數 包括 [] 結果 同名 分享 慕課 自己
什麼是內部類
內部類( Inner Class )就是定義在另外一個類裡面的類。與之對應,包含內部類的類被稱為外部類。
內部類作用
1. 內部類提供了更好的封裝,可以把內部類隱藏在外部類之內,不允許同一個包中的其他類訪問該類
2. 內部類的方法可以直接存取外部類的所有資料,包括私人的資料
3. 內部類所實現的功能使用外部類同樣可以實現,只是有時使用內部類更方便
內部類有幾種
1、成員內部類
成員內部類是依附外部類而存在的,也就是說,如果要建立成員內部類的對象,前提是必須存在一個外部類的對象。
成員內部類是最普通的內部類,它的定義為位於另一個類的內部,形如下面的形式:
//外部類HelloWorldpublic class HelloWorld { // 內部類Inner,類Inner在類HelloWorld的內部 public class Inner { // 內部類的方法 public void show() { System.out.println("I Love cjj!"); } } public static void main(String[] args) { // 建立外部類對象 HelloWorld hello = new HelloWorld(); // 建立內部類對象 Inner i = hello.new Inner(); // 調用內部類對象的方法 i.show(); }}
在這裡 HelloWorld 屬於一個外部類,而 Inner 類屬於一個內部類。
調用內部類的時候首先是將外部類執行個體化,例如:HelloWorld hello = new HelloWorld();
然後再將內部類執行個體化,例如:Inner i = hello.new Inner();
然後通過內部類實現的對象來調用內部類的成員,例如:i.show();
注意:
當成員內部類擁有和外部類同名的成員變數或者方法時,會發生隱藏現象,即預設情況下訪問的是成員內部類的成員。
如果要訪問外部類的同名成員,需要以下面的形式進行訪問:
外部類.this.成員變數外部類.this.成員方法
雖然成員內部類可以無條件地訪問外部類的成員,而外部類想訪問成員內部類的成員卻不是這麼隨心所欲了。
在外部類中如果要訪問成員內部類的成員,必須先建立一個成員內部類的對象,再通過指向這個對象的引用來訪問
執行個體:
//外部類public class Outer { private int a = 99; // 外部類的私人屬性 //內部類Inner public class Inner{ int b = 2; //內部類的成員屬性 public void test() { System.out.println("訪問外部類中的a:" + a); System.out.println("訪問內部類中的b:" + b); } } //測試成員內部類 public static void main(String[] args) { Outer o = new Outer(); //建立外部類對象,對象名為a Inner i = o.new Inner(); //使用外部類對象建立內部類對象,對象名為i i.test(); //調用內部類對象的test方法 }}
運行結果:
訪問外部類中的a:99訪問內部類中的b:2
從上面的代碼中我們可以看到,成員內部類的使用方法:
1、 Inner 類定義在 Outer 類的內部,相當於 Outer 類的一個成員變數的位置,Inner 類可以使用任意存取控制符,如 public 、 protected 、 private 等
2、 Inner 類中定義的 test() 方法可以直接存取 Outer 類中的資料,而不受存取控制符的影響,如直接存取 Outer 類中的私人屬性a
3、 定義了成員內部類後,必須使用外部類對象來建立內部類對象,而不能直接去 new 一個內部類對象,即:內部類 對象名 = 外部類對象.new 內部類( );
4、 編譯上面的程式後,會發現產生了兩個 .class 檔案
其中,第二個是外部類的 .class 檔案,第一個是內部類的 .class 檔案,即成員內部類的 .class 檔案總是這樣:外部類名$內部類名.class
另外,友情提示哦:
1、 外部類是不能直接使用內部類的成員和方法滴
可先建立內部類的對象,然後通過內部類的對象來訪問其成員變數和方法。
2、 如果外部類和內部類具有相同的成員變數或方法,內部類預設訪問自己的成員變數或方法,如果要訪問外部類的成員變數,可以使用 this 關鍵字。
如:HelloWorld.this.name
//外部類HelloWorldpublic class HelloWorld{ //外部類的私人屬性name private String name = "imooc"; //外部類的成員屬性 int age = 20; //成員內部類Inner public class Inner { String name = "愛慕課"; //內部類中的方法 public void show() { System.out.println("外部類中的name:" + HelloWorld.this.name);//訪問外部類的成員變數,可以使用 this 關鍵字 System.out.println("內部類中的name:" + name); System.out.println("外部類中的age:" + age); } } //測試成員內部類 public static void main(String[] args) { //建立外部類的對象 HelloWorld o = new HelloWorld (); //建立內部類的對象 Inner i = o.new Inner(); //調用內部類對象的show方法 i.show(); }}2.方法內部類
方法內部類就是內部類定義在外部類的方法中,方法內部類只在該方法的內部可見,即只在該方法內可以使用。
//外部類public class MOuter { //外部類中的方法 public void show() { final int a = 25; //常量 int b = 13; //變數 //方法內部類 class MInner{ int c = 2; //內部類中的變數 public void print() { System.out.println("訪問外部方法中的常量a:" + a); System.out.println("訪問內部類的變數c:" + c); } } MInner mi = new MInner();//建立方法內對象 mi.print();//調用內部類的方法 } //測試方法內部類 public static void main(String[] args) { MOuter mo = new MOuter();//建立外部類對象 mo.show();//調用外部類的方法 }}
注意: 局部內部類就像是方法裡面的一個局部變數一樣,是不能有 public、protected、private 以及 static 修飾符的。
3.方法內部類
靜態內部類是 static 修飾的內部類,這種內部類的特點是:
1、 靜態內部類不能直接存取外部類的非靜態成員,但可以通過 new 外部類().成員 的方式訪問
2、 如果外部類的靜態成員與內部類的成員名稱相同,可通過“類名.靜態成員”訪問外部類的靜態成員;
如果外部類的靜態成員與內部類的成員名稱不相同,則可通過“成員名”直接調用外部類的靜態成員
3、 建立靜態內部類的對象時,不需要外部類的對象,可以直接建立 內部類 對象名= new 內部類();
//外部類public class SOuter { private int a = 99;//外部類的私人變數 static int b = 1; //外部類的靜態變數 //靜態內部類 public static class SInner{ int b = 2;//內部類的變數 public void test() { System.out.println("訪問外部類中的b:" + SOuter.b); System.out.println("訪問內部類中的b:" + b); } } //測試靜態內部類 public static void main(String[] args) { SInner si = new SInner();//直接建立內部類的對象 si.test();//調用test()方法 }}4.匿名內部類
未完待續
Java 內部類