在這小編帶給大家講解一下內部類的基本知識點,在學習Android開發之前我們要對內部類要有所認識,因為在Android的實際開發中內部類的定義我們非常常見,所有小編在這要特意講解,認識一下內部類的語法定義規則
學習目標:
掌握內部類定義
掌握內部類的優缺點
掌握內部類的使用格式
掌握static 聲明內部類的作用
在一個類B的內部定義一個類為A,那我們通常叫A類為B類中的內部類,內部類可以聲明成public或者private。當內部類聲明成public或著private時,對其訪問的限制與成員變量和成員方法完全相同,往往定義內部類的作用實現類之間的高內聚,代碼不對外開放的,實現一些敏感數據不那麼輕易被訪問的作用
標識符 class 外部類的名稱{ //外部類成員 標識符 class 內部類的名稱{ //內部類成員 } }
在內部類的學習中我們最常見的內部類有如下三種形式
成員內部類 、方法內部類、匿名內部類
成員內部類:在一個外部類的內部且方法外定義的類我們稱為外部類 ,該類特點是高度內聚,不對外開放
方法內部類(局部內部類):在一個方法內部定義的類我們通常叫做方法內部類或者局部內部類 該類特點是短暫性的,不對外的
匿名內部類:要滿足匿名內部類操作在實現該類操作時必須是一個抽象類或者是一個接口,這樣才能使用內部類操作,在實現一個內部類操作時,同時是重寫未實現的方法,也是高內聚的特點
在講解內部類的優缺點時,實現我們編寫兩個程序簡單的對比內部類的優缺點
package anonymousinner; public class OutClass { //定義一個外部類字符串屬性 private String info ="內部類"; //定義一個內部類 class Inner{ //編寫一個內部類方法 public void printInfo(){ System.out.println(info); } } //定義一個外部類方法 public void print(){ //執行調用內部類方法操作 new Inner().printInfo() ; } public static void main(String[] args) { new OutClass().print() ; } }
2. 案例2
package anonymousinner.test; class Out{ //定義一個字符串屬性 private String info ="內部類"; //將Inner方法內容輸出 public void print(){ new Inner(this).printInfo() ; } public String getInfo(){ return this.info ; } } class Inner{ private Out out ; public Inner(Out out){ this.out = out ; } //編寫一個內部類方法 public void printInfo(){ System.out.println(out.getInfo()); } } public class OutClassTwo { public static void main(String[] args) { //測試輸出 new Out().print() ; } }
結合以上兩個案例代碼可以看出使用內部類的代碼量往往要比不使用內部類案例代碼量要多,而復雜度也增加了,使用內部類最大的優點可以方便訪問外部類中的私有屬性,而使用內部類最大缺點就是在一個正常類操作中,類中只定義了屬性或方法。如果再定義一個內部類的話,則破壞了代碼的整體結構
剛才上述案例中也是講解了內部類的一種形式叫做成員內部類
接下來講解的是方法內部類
package anonymousinner; public class FunClass { private String info ="外部類屬性值" ; public static void main(String[] args) { //執行測試 new FunClass().print() ; } public void print(){ class Inner{ //定義一個帶有參數內部類方法 public void printInfo(String str){ System.out.println("這是誰的值:"+str); System.out.println("這是誰的值:"+info); } } ; new Inner().printInfo("內部類參數值") ; } }
在使用是static聲明一個內部類,聲明的內部類就稱為外部類了,直接可以在類的外部進行外部調用,如果要訪問外部類的屬性則必須是static訪問權限,否則不可直接調用外部類的屬性
package anonymousinner.test; class A{ private static String name ="XiaoMing"; static class B{ public void said(){ System.out.println(name+"可以說話了"); } } } public class StaticInnerClass { public static void main(String[] args) { //執行調用 new A.B().said() ; } }
一旦內部類用static修飾這該內部類可以被外部進行調用,那調用的形式又是怎麼呀的呢?我們可以通過以下格式進行調用
外部類.內部類 內部對象 = 外部類實例.new 內部類()
在實際開發中如果一個類在這個程序中只是使用一次的話,就可以將該類定義為匿名內部類,匿名內部類是在抽象類以及接口的繼承上發展而來,往往在實現多態操作中發揮的重要作用,且在Android的學習中匿名內部類是非常常見的程序編程形式,還有眾多的java框架中也運用的比較多,我們主要學習掌握匿名內部類的語法定義和使用
package anonymousinner; //定義一個接口 interface IUSB{ public void start() ; } //定義一個類實現該接口 class Conputer implements IUSB{ public void start() { System.out.println("電腦中的USB啟動了"); } } public class Test { public static void main(String[] args) { //直接以接口形式實現 new Test().print(new Conputer()); //通過匿名實現 new Test().print2() ; } //第一種直接通過調用 public void print(IUSB usb){ usb.start() ; } public void print2(){ //編寫一個匿名內部類 IUSB comput2 = new IUSB(){ public void start() { System.out.println("電腦2USB啟動"); } } ; comput2.start() ; } }
在使用匿名內部時,如果電腦這個類只需要使用一次,那我們還要而外聲明一個類嗎?答案是不用的,所以匿名內部類的好處就體現在這了
以上就是匿名內部類的講解內容啦!如果對小編寫的內容有疑問或者寫的不對的地方那懇請各位給小編留言啦,謝謝