如果你需要本文中提到的技術(shù),你在理解上有問題,請和QQ1750214342聯(lián)系,我們提供免費技術(shù)咨詢服務。 Java 內(nèi)部類種類及使用解析
內(nèi)部類Inner Class將相關(guān)的類組織在一起,從而降低了命名空間的混亂。 一個內(nèi)部類可以定義在另一個類里,可以定義在函數(shù)里,甚至可以作為一個表達式的一部分。 Java中的內(nèi)部類共分為四種: 靜態(tài)內(nèi)部類static inner class (also called nested class) 成員內(nèi)部類member inner class 局部內(nèi)部類local inner class 匿名內(nèi)部類anonymous inner class 靜態(tài)內(nèi)部類Static Inner Class最簡單的內(nèi)部類形式。 類定義時加上static關(guān)鍵字。 不能和外部類有相同的名字。 被編譯成一個完全獨立的.class文件,名稱為OuterClass$InnerClass.class的形式。 只可以訪問外部類的靜態(tài)成員和靜態(tài)方法,包括了私有的靜態(tài)成員和方法。 生成靜態(tài)內(nèi)部類對象的方式為: OuterClass.InnerClass inner = new OuterClass.InnerClass(); 靜態(tài)內(nèi)部類使用代碼: ![]() package com.learnjava.innerclass; class StaticInner { private static int a = 4; // 靜態(tài)內(nèi)部類 public static class Inner { public void test() { // 靜態(tài)內(nèi)部類可以訪問外部類的靜態(tài)成員 // 并且它只能訪問靜態(tài)的 System.out.println(a); } } } public class StaticInnerClassTest { public static void main(String[] args) { StaticInner.Inner inner = new StaticInner.Inner(); inner.test(); } }
成員內(nèi)部類Member Inner Class成員內(nèi)部類也是定義在另一個類中,但是定義時不用static修飾。 成員內(nèi)部類和靜態(tài)內(nèi)部類可以類比為非靜態(tài)的成員變量和靜態(tài)的成員變量。 成員內(nèi)部類就像一個實例變量。 它可以訪問它的外部類的所有成員變量和方法,不管是靜態(tài)的還是非靜態(tài)的都可以。 在外部類里面創(chuàng)建成員內(nèi)部類的實例: this.new Innerclass(); 在外部類之外創(chuàng)建內(nèi)部類的實例: (new Outerclass()).new Innerclass(); 在內(nèi)部類里訪問外部類的成員: Outerclass.this.member 詳情見代碼例子: ![]() package com.learnjava.innerclass; class MemberInner { private int d = 1; private int a = 2; // 定義一個成員內(nèi)部類 public class Inner2 { private int a = 8; public void doSomething() { // 直接訪問外部類對象 System.out.println(d); System.out.println(a);// 直接訪問a,則訪問的是內(nèi)部類里的a // 如何訪問到外部類里的a呢? System.out.println(MemberInner.this.a); } } } public class MemberInnerClassTest { public static void main(String[] args) { // 創(chuàng)建成員內(nèi)部類的對象 // 需要先創(chuàng)建外部類的實例 MemberInner.Inner2 inner = new MemberInner().new Inner2(); inner.doSomething(); } }
局部內(nèi)部類Local Inner Class局部內(nèi)部類定義在方法中,比方法的范圍還小。是內(nèi)部類中最少用到的一種類型。 像局部變量一樣,不能被public, protected, private和static修飾。 只能訪問方法中定義的final類型的局部變量。 局部內(nèi)部類在方法中定義,所以只能在方法中使用,即只能在方法當中生成局部內(nèi)部類的實例并且調(diào)用其方法。 ![]() package com.learnjava.innerclass; class LocalInner { int a = 1; public void doSomething() { int b = 2; final int c = 3; // 定義一個局部內(nèi)部類 class Inner3 { public void test() { System.out.println("Hello World"); System.out.println(a); // 不可以訪問非final的局部變量 // error: Cannot refer to a non-final variable b inside an inner // class defined in a different method // System.out.println(b); // 可以訪問final變量 System.out.println(c); } } // 創(chuàng)建局部內(nèi)部類的實例并調(diào)用方法 new Inner3().test(); } } public class LocalInnerClassTest { public static void main(String[] args) { // 創(chuàng)建外部類對象 LocalInner inner = new LocalInner(); // 調(diào)用外部類的方法 inner.doSomething(); } }
匿名內(nèi)部類Anonymous Inner Class匿名內(nèi)部類就是沒有名字的局部內(nèi)部類,不使用關(guān)鍵字class, extends, implements, 沒有構(gòu)造方法。 匿名內(nèi)部類隱式地繼承了一個父類或者實現(xiàn)了一個接口。 匿名內(nèi)部類使用得比較多,通常是作為一個方法參數(shù)。 ![]() package com.learnjava.innerclass; import java.util.Date; public class AnonymouseInnerClass { @SuppressWarnings("deprecation") public String getDate(Date date) { return date.toLocaleString(); } public static void main(String[] args) { AnonymouseInnerClass test = new AnonymouseInnerClass(); // 打印日期: String str = test.getDate(new Date()); System.out.println(str); System.out.println("----------------"); // 使用匿名內(nèi)部類 String str2 = test.getDate(new Date() { });// 使用了花括號,但是不填入內(nèi)容,執(zhí)行結(jié)果和上面的完全一致 // 生成了一個繼承了Date類的子類的對象 System.out.println(str2); System.out.println("----------------"); // 使用匿名內(nèi)部類,并且重寫父類中的方法 String str3 = test.getDate(new Date() { // 重寫父類中的方法 @Override @Deprecated public String toLocaleString() { return "Hello: " + super.toLocaleString(); } }); System.out.println(str3); } }
生成的.class文件中,匿名類會生成OuterClass$1.class文件,數(shù)字根據(jù)是第幾個匿名類而類推。 Swing中使用內(nèi)部類的例子如下: ![]() package com.learnjava.innerclass; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.JButton; import javax.swing.JFrame; public class SwingTest { public static void main(String[] args) { JFrame frame = new JFrame("JFrame"); JButton button = new JButton("JButton"); button.addActionListener(new ActionListener() { // new出來一個實現(xiàn)了ActionListener接口的類的實例 @Override public void actionPerformed(ActionEvent arg0) { System.out.println("Hello World"); } }); //加入按鈕 frame.getContentPane().add(button); //設置關(guān)閉行為 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(200, 200); frame.addWindowListener(new WindowAdapter() { //也可以使用繼承了適配器類的匿名內(nèi)部類 @Override public void windowClosing(WindowEvent e) { System.out.println("Closing"); System.exit(0); } }); frame.setVisible(true); } } 新趨勢IT教育 www.xinqushi.net 免費在線技術(shù)交流QQ群 258897306 頂級老師課程+16小時全天在線輔導+IT企業(yè)師傅領(lǐng)進門+就業(yè)推薦+就業(yè)后一年內(nèi)技術(shù)問題全包+就業(yè)后學費返還 學費低,時間自由,適合在校大學生和在崗充電人士,咨詢QQ:1535741932 |
|