JAVA基礎之內部類,JAVA基礎部類
JAVA基礎之內部類
2017-01-13
1、java中的內部類都有什嗎?!
成員內部類
局部內部類
匿名內部類
靜態內部類
2、內部類詳解 •成員內部類
在一個類的內部再建立一個類,成為內部類
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 }