內部類:在一個類(外圍類OuterClass)中定義另一個類(內部類InnerClass),借用其他博主的舉例,外圍類是人,人由各個器官組成,如心臟,內部類是心臟,心臟有自己的屬性和方法,同時也可以訪問身體的屬性。InnerClass可以分成四大類:成員內部類、局部內部類、匿名內部類、靜態內部類。
package com.yuan.test;public class MerberInnerClass { /** * @param args */ PRivate String name; public int iNumber; MerberInnerClass(String name, int iNumber) { this.name = name; this.iNumber = iNumber; } public void fun() { System.out.println("hello"); } public class InnerClass { private int number = 0; public int iNumber = 2; public String getName() { return name; } public int getNumber() { return number; } public void fun() { int iNumber = 3; System.out.println("local variable is :" + iNumber); System.out.println("inner variable is :" + this.iNumber); System.out.println("outer variable is :" + MerberInnerClass.this.iNumber);//外圍類域訪問格式:OuterClass.this.field MerberInnerClass.this.fun();//外圍類方法訪問格式:OuterClass.this.method } } public static void main(String[] args) { // TODO Auto-generated method stub MerberInnerClass merber = new MerberInnerClass("Estelle", 1); MerberInnerClass.InnerClass inner = merber.new InnerClass();// 外圍類引用內部類格式:outerObject.new InnerClass(); System.out.println("private name is :" + inner.getName());// 內部類可以訪問外圍內作用域中數據 System.out.println("private number is :" + inner.getNumber()); inner.fun(); }}運行結果:private name is :Estelleprivate number is :0local variable is :3inner variable is :2outer variable is :1hello成員內部類有以下特性:
內部類可以擁有private訪問權限、protected訪問權限、public訪問權限及包訪問權限。外部類只能被public和包訪問兩種權限修飾可訪問外圍類的所有成員屬性和方法成員內部類不存在任何static的變量和方法,個人理解是:成員內部類需訪問外圍類數據,即先有外圍類后有內部類,所以內部類不存在static變量或方法2、局部內部類(Local Inner Class)
局部內部類是定義在一個方法或者一個作用域里面的類,它和成員內部類的區別在于局部內部類的訪問僅限于方法內或者該作用域內。
package com.yuan.TalkClock;import java.awt.Toolkit;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.util.Date;import javax.swing.Timer;public class TalkingClock { public TalkingClock() { // TODO Auto-generated constructor stub } public void start(int interval, final boolean beef) {//局部內部類可以訪問外圍類中修飾符為final的局部變量 class TimePrinter implements ActionListener {//局部內部類不能被申明為private、public @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub Date now = new Date(); System.out.println("At the tone:" + now); if (beef) Toolkit.getDefaultToolkit().beep(); } } ActionListener listener = new TimePrinter(); Timer t = new Timer(interval, listener); t.start(); }}局部內部類有以下特性: 局部類不能用public或private訪問修飾符聲明,原因:類修飾符只能為public、private、final,局部變量修飾符只能為final 對同一個包中的其他類隱藏起來 不僅能訪問外部類,也可以訪問被final修飾的局部變量為什么只能訪問final修飾的局部變量?因為內部類代碼實際訪問的是新增構造器傳入外部本地變量值的復制,即在構造其中新增一個特殊字段,在內部類中修改新增字段并不能反饋到鄭重的外部類本地變量中,為了保證修改變量的一致性,選擇final修飾符確保變量同步性3、匿名內部類
public class OuterClass { private String name ; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } class InnerClass{ public InnerClass(){ name = "chenssy"; age = 23; } }}匿名內部類特性:借用think in java 內部類可以用多個實例,每個實例都有自己的狀態信息,并且與其他外圍對象的信息相互獨立。 在單個外圍類中,可以讓多個內部類以不同的方式實現同一個接口,或者繼承同一個類。 創建內部類對象的時刻并不依賴于外圍類對象的創建。 內部類并沒有令人迷惑的“is-a”關系,他就是一個獨立的實體。 內部類提供了更好的封裝,除了該外圍類,其他類都不能訪問。4、靜態內部類
只需要將一個類隱藏到另一類中,不需要內部類引用外圍類,則可以使用static Inner Class,俗稱嵌套內部類。用static 將內部內靜態化,內部類就只能訪問外部類的靜態成員變量,可以直接用OuterClass.InnerClass。
package com.yuan.test;public class Out { /** * @param args */ private static int age = 12; public static class In { public static void print() { System.out.println(age); } } public static void main(String[] args) { Out.In in = new Out.In(); in.print(); } }運行結果:12
新聞熱點
疑難解答