概述: 就是把一個類定義在另一個類中,那麼這個類我們就将其稱之為内部類
按照位置進行分類
* 成員内部類 就是把這個類定義在了成員位置(類中方法外的位置)* 局部内部類 就是把這個類定義在局部位置(方法定義中的位置)*private: 提高資料的安全性
*static : 通路其他的類通路
*非靜态的成員内部類被其他類建立對象的格式: 外部類名.内部類名 對象名 = 外部類對象.内部類對象 ;
*靜态的成員内部類被其他類建立對象的格式: 外部類名.内部類名 對象名 = new 外部類名.内部類名() ;
特點
為什麼局部内部類在通路局部變量的時候,要求這個局部變量要被final修飾?因為當調用這個方法時,局部變量如果沒有用final修飾,他的生命周期和方法的生命周期是一樣的,當方法彈棧,這個局部變量也會消失,那麼如果局部内部類對象還沒有馬上消失想用這個局部變量,就沒有了,如果用final修飾會在類加載的時候進入常量池,即使方法彈棧,常量池的常量還在,也可以繼續使用,但是jdk1.8取消了這個事情,是以我認為這是個bug
内部類的特點
* 内部類可以直接通路外部類的成員,包含私有的public class aa { public static void main(String[] args) { // 外部類名.内部類名 對象名 = 外部類名.内部類對象; Outer.Inner oi = new Outer.Inner(); oi.method(); Outer.Inner2.print(); } } //靜态的内部類 class Outer { static class Inner { public void method() { System.out.println("method"); } } static class Inner2 { public static void print() { System.out.println("print"); } } }
public class aa { public static void main(String[] args) { Outer.Inner oi = new Outer().new Inner(); oi.show(); } } //成員内部類 // 要求:使用已知的變量,在控制台輸出30,20,10。 // 内部類之是以能擷取到外部類的成員,是因為他能擷取到外部類的引用外部類名.this class Outer { public int num = 10; class Inner { public int num = 20; public void show() { int num = 30; System.out.println(num); System.out.println(this.num); System.out.println(Outer.this.num); } } }
public class aa { public static void main(String[] args) { // Outer.Inner oi = new Outer().new Inner(); // oi.method(); Outer o = new Outer(); o.print(); } } class Outer { private int num = 10; private class Inner { public void method() { System.out.println(num); } } public void print() { Inner i = new Inner(); i.method(); } }
public class aa { public static void main(String[] args) { Outer o = new Outer(); o.method(); } } // 局部内部類 class Outer { public void method() { final int num = 10; class Inner { public void print() { System.out.println(num); } } Inner i = new Inner(); i.print(); } /* * public void run() { Inner i = new Inner(); //局部内部類,隻能在其所在的方法中通路 * i.print(); } */ }