2017-01-13
成員內部類
局部內部類
匿名內部類
靜態內部類
在一個類的內部再創建一個類,成為內部類
1)在一個類中使用內部類,可以在內部類中直接存取所在類的私有屬性或方法
1 class Outer{ 2 //外部類Outer 3 private int i = 111 ;//外部類私有變量 4 class Inner{ 5 //內部類Inner 6 private int j = 222 ;//內部類私有變量 7 public void print(){ 8 System.out.println("外部類的私有屬性"+ i); 9 System.out.println("內部類的私有屬性"+ j); 10 } 11 } 12 } 13 public class ClassDemo5 { 14 public static void main(String[] args) { 15 Outer o = new Outer() ; 16 Outer.Inner i = o.new Inner() ; 17 i.print() ; 18 } 19 }
2)內部類的實例化方法
import 面向對象基礎.Outer.Inner;
//第一種方式:導入import 面向對象基礎.Outer.Inner;包
Outer.Inner i = o.new Inner() ; //第二種方式:外部類.內部類 對象名 = 外部類對象.new 內部類
3)外部類訪問內部類
1 class Fatch{ 2 //外部類Fatch 3 public class Student{ 4 //內部類Student 5 public void show(){ 6 //內部類show()方法 7 System.out.println("內部類Student的show()方法"); 8 } 9 } 10 public void print(){ 11 /** 12 * 外部類不可以直接訪問內部類的屬性或方法, 13 * 必須創建內部類對象才可以訪問 14 */ 15 new Student().show() ; //使用匿名對象實例化調用內部類的類成員 16 System.out.println("外部類Fatch的print()方法"); 17 } 18 } 19 public class ClassDemo4 { 20 public static void main(String[] args) { 21 Fatch f = new Fatch() ; //實例化外部類對象 22 f.print() ; //調用外部類的print()方法 23 } 24 }
4)如果外部類和內部類具有相同的成員變量或方法,內部類默認訪問自己的成員變量或方法,如果要訪問外部類的成員變量,可以使用 this 關鍵字。
1 class Outer1 { 2 //外部類 3 private int i = 10 ;//外部類私有變量 4 class Inner1{ 5 //內部類 6 private int i = 20 ;//內部類私有變量 7 public void show(){ 8 //內部類方法 9 System.out.println("內部類的變量"+ this.i );//使用this關鍵字訪問內部類成員 10 System.out.println("外部類的變量"+ Outer1.this.i);//使用外部類名.this.變量名 來訪問外部類成員 11 } 12 } 13 public void print(){ 14 new Inner1().show() ; //調用內部類方法 15 } 16 } 17 public class ClassDemo6 { 18 public static void main(String[] args) { 19 new Outer1().print() ; 20 } 21 22 }
•注意點:
»實例化內部類之前必須實例化外部類
»內部類可以隨意訪問他的外部類成員,但外部類不可以直接訪問內部類的類成員
»內部類可以被聲明為private 或 protected 權限的訪問
»內部類對象會依賴於外部類對象,除非已經存在一個外部類對象,否則類中不會出現內部類對象
內部類不僅可以在類中進行定義,也可以在類的局部位置進行定義,例如在類的方法或者任意的作用域中都可以定義內部類
1)在外部類的方法中定義一個方法內部類
1 class Demo1{ 2 //外部類Demo 3 final int I = 10 ;//外部類定義的常量 4 public void show(){ //外部類的show()方法 5 class Inne{ //方法內部類 6 int j = 20 ; //方法內部類變量 7 private void inshow() { //方法內部類中的inshow()方法 8 System.out.println("外部類常量"+ I ); 9 System.out.println("方法內部類變量"+ j ); 10 } 11 } 12 Inne in = new Inne() ; //實例化內部類對象 13 in.inshow() ; //調用內部類方法 14 } 15 } 16 public class ClassDemo7 { 17 public static void main(String[] args) { 18 Demo1 d = new Demo1() ; 19 d.show() ; 20 } 21 }
注意:如果方法中的參數需要被傳遞進去,就必須把參數聲明成final類型
如果一個內部類被聲明為static,此內部類就稱為外部類
1)靜態內部類可以通過(new 外部類名.內部類.內部類方法名) ,來調用靜態內部類方法
1 class Outer2{ 2 //外部類 3 private static String str = "張博傑" ;//外部類的靜態變量 4 static class Inner2{ 5 //使用static聲明 的靜態內部類 6 public void fun() { 7 //靜態內部類方法 8 System.out.println("外部類的靜態變量"+" "+ str); 9 } 10 } 11 } 12 public class ClassDemo8 { 13 public static void main(String[] args) { 14 new Outer2.Inner2().fun() ; 15 //靜態內部類可以使用new 外部類名.內部類.內部類方法名 ,來調用靜態內部類方法 16 } 17 }
匿名內部類也就是沒有名字的內部類,正因為沒有名字,所以匿名內部類只能使用一次,它通常用來簡化代碼編寫.使用匿名內部類還有個前提條件:必須繼承一個父類或實現一個接口
1)匿名內部類的實現
1 abstract class A2 { //抽象類A2 2 public abstract void eat() ; 3 } 4 public class ClassDemo9 { 5 public static void main(String[] args) { 6 /** 7 * 如果A2這個抽象類只用一次,那麼就可一使用匿名內部類來實現 8 */ 9 A2 a = new A2(){ 10 public void eat(){ 11 System.out.println("我要吃飯"); 12 } 13 } ; 14 a.eat() ; 15 } 16 }