JAVA作用域修飾符,不寫時默認為default:
外部類修飾符只能是public和default(默認值)
結合java編程思想來理解,即public體現java面向接口編程,private體現java的對象封裝,protected體現java的對象繼承
內部類修飾符:
○ 成員內部類:跟成員變量一樣沒有作用域修飾符限制(創建依賴於外部類,即在外部類中如果要訪問成員內部類成員時,需要先創建外部類對象,通過外部類對象引用來訪問內部類對象),創建成員內部類方式:new OutterClass().new InnerClass();
○ 靜態內部類:跟靜態變量一樣沒有作用域修飾符限制,創建靜態內部類方式:new OutterClass.InnerClass();
○ 局部內部類:跟局部變量一樣不能有作用域修飾符
○ 匿名內部類:無修飾符
代碼如下:
/** * @author longe * 內部類作用: * 1.每個內部類都能獨立的繼承一個接口的實現,所以無論外部類是否已經繼承了某個(接口的)實現,對於內部類都沒有影響。內部類使得多繼承的解決方案變得完整, * 2.方便將存在一定邏輯關系的類組織在一起,又可以對外界隱藏。 * 3.方便編寫事件驅動程序 * 4.方便編寫線程代碼 * 內部類的存在使得Java的多繼承機制變得更加完善。 * */ public class Test { private int a = 1; public static void main(String[] args) { Test test = new Test(); test.print(); // 成員內部類的創建,依賴於外部類對象,即必須先創建外部類對象,再通過該對象引用來創建成員內部類 Test.T testT = test.new T(); testT.print(); // 靜態內部類的創建 Test.TT testTT = new Test.TT(); testTT.print(); TestIF teIf = new TestIF() { /* (non-Javadoc) * 匿名內部類,常用於時間監聽調用 */ @Override public void print() { System.out.println("anonymity inner class - " + 5); } }; teIf.print(); } /** * 局部內部類,作用范圍在方法內部 */ public void print() { class T { private int a = 4; } T t = new T(); System.out.println("method inner class - " + t.a); } /** * @author longe * 成員內部類,可以隨意訪問外部類變量和方法 * 當內部類成員變量與外部類重復時,注意引用方式 */ class T { private int a = 2; public void print() { System.out.println("member inner class - " + this.a); // 引用外部類成員變量 System.out.println("member inner class - " + Test.this.a); } } /** * @author longe * 靜態內部類,可以隨意訪問外部類變量和方法 */ static class TT { private int a = 3; public void print() { System.out.println("static inner class - " + this.a); } } }
關於繼承內部類需要注意的地方,見代碼注釋:
/** * @author longe * 內部類是很少用來作為繼承用的。但是當用來繼承的話,要注意兩點: * 1)成員內部類的引用方式必須為 Test.T. * 2)構造器中必須有指向外部類對象的引用,並通過這個引用調用super() * 這段代碼摘自《Java編程思想》 */ public class InheritInner extends Test.T{ /** * @param test * InheritInner不能通過編譯,必須加上此構造函數,參數為父類的外部類形參 */ public InheritInner(Test test) { // 必須加上外部類的構造調用,否則編譯不通過,因為成員內部類T依賴於它的外部類Test // 創建InheritInner時會先初始化父類,所以在此需要顯示的構造父類的外部類Test test.super(); } public static void main(String[] args) { Test test = new Test(); InheritInner inner = new InheritInner(test); inner.print(); } }