最近在講Java中的內(nèi)部類(lèi),感覺(jué)內(nèi)部類(lèi)實(shí)際上對(duì)于初學(xué)者用得不多,那么內(nèi)部類(lèi)簡(jiǎn)單的說(shuō),其實(shí)就是在一個(gè)類(lèi)的內(nèi)部定義的類(lèi)。 按照定義的情況分為:成員內(nèi)部類(lèi),局部?jī)?nèi)部類(lèi),靜態(tài)內(nèi)部類(lèi),匿名內(nèi)部類(lèi)。 成員內(nèi)部類(lèi),就是定義一個(gè)當(dāng)作類(lèi)的成員變量的類(lèi)。 局部?jī)?nèi)部類(lèi),就是在類(lèi)里面定義一個(gè)當(dāng)作局部變量的類(lèi),通常是在方法或代碼塊中使用。 靜態(tài)內(nèi)部類(lèi),就是在類(lèi)中定義一個(gè)靜態(tài)變量,而該靜態(tài)變量是一個(gè)類(lèi)。 匿名內(nèi)部類(lèi),通常是在創(chuàng)建一個(gè)接口對(duì)象,該對(duì)象是在創(chuàng)建對(duì)象的同時(shí)實(shí)現(xiàn)接口,而該接口的實(shí)現(xiàn)只是在此處使用一次,所以不需要定義名字,稱(chēng)為匿名內(nèi)部類(lèi)。 請(qǐng)看如下代碼: public interface MyInter{ public void method(); } public class Outter { // public static int i; // 普通靜態(tài)變量 // 靜態(tài)內(nèi)部類(lèi) public static class Inner3{ } // public String name; // 普通成員變量 // 成員內(nèi)部類(lèi) public class Inner1{ } public void test() { // String n; // 普通局部變量 // 局部?jī)?nèi)部類(lèi) class Inner2{ } // 匿名內(nèi)部類(lèi),在運(yùn)行時(shí)會(huì)生成一個(gè)臨時(shí)的名字,類(lèi)似:Outter$1.java MyInter in = new MyInter() { @Override public void method() { } }; } } 上面的代碼展示了4種不同的內(nèi)部類(lèi)的情形。 接下來(lái)看看這4種情形的具體用法。 靜態(tài)內(nèi)部類(lèi): public class Outter { public int o1; public static int os1; public void om1() { System.out.println(Inner3.ns3); System.out.println(new Inner3().n3); System.out.println("om1"); } public static void oms1() { System.out.println("oms1"); } // public static int i; // 靜態(tài)內(nèi)部類(lèi) public static class Inner3{ // 在靜態(tài)內(nèi)部類(lèi)中可以定義基本的成員和方法,以及靜態(tài)成員和方法 public int n3; public static int ns3; public void m3() { System.out.println("m3"); } public static void ms3() { System.out.println(os1); oms1(); System.out.println("ms3"); } } } 靜態(tài)內(nèi)部類(lèi)的使用: public static void main(String[] args) { Outter.Inner3 i3 = new Outter.Inner3(); i3.n3 = 3; Outter.Inner3.ns3 = 4; Outter.Inner3.ms3(); i3.m3(); } 可以看到靜態(tài)內(nèi)部類(lèi)和靜態(tài)變量使用方式差不多,直接使用類(lèi)名即可。 成員內(nèi)部類(lèi): //成員內(nèi)部類(lèi) public class Inner1{ public int n1; public int o1; public void m1(int o1) { o1 = 1; // 局部變量 this.o1 = 2; // 當(dāng)前屬性 Outter.this.o1 = 4; // 外部屬性 om1(); System.out.println("m1"); } } 成員內(nèi)部類(lèi)的使用: public static void main(String[] args) { // 調(diào)用 Outter.Inner1 i1 = new Outter().new Inner1(); i1.n1 = 3; i1.m1(3); } 由于是成員,所以需要先創(chuàng)建對(duì)象才能使用。 局部?jī)?nèi)部類(lèi)和匿名內(nèi)部類(lèi):相當(dāng)于局部變量,只能在方法里面調(diào)用和創(chuàng)建對(duì)象等,可以調(diào)用外部的變量和方法,外部不能調(diào)用它。請(qǐng)看如下方法: public void test() { // String n; // 局部?jī)?nèi)部類(lèi) class Inner2{ public void m2() { o1 = 3; } } Inner2 i2 = new Inner2(); i2.m2(); // 匿名內(nèi)部類(lèi),在運(yùn)行時(shí)會(huì)生成一個(gè)臨時(shí)的名字,類(lèi)似:Outter$1.java MyInter in = new MyInter() { @Override public void method() { o1 = 3; } }; in.method(); } 至此,內(nèi)部類(lèi)簡(jiǎn)單的使用基本就到這了。 |
|
來(lái)自: 好程序員IT > 《Java培訓(xùn)教程》