成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Java內(nèi)部類(lèi)和匿名內(nèi)部類(lèi)的用法說(shuō)明

瀏覽:8日期:2022-08-27 09:01:52

一、內(nèi)部類(lèi): 

(1)內(nèi)部類(lèi)的同名方法

內(nèi)部類(lèi)可以調(diào)用外部類(lèi)的方法,如果內(nèi)部類(lèi)有同名方法必須使用'OuterClass.this.MethodName()'格式調(diào)用(其中OuterClass與MethodName換成實(shí)際外部類(lèi)名及其方法;this為關(guān)鍵字,表示對(duì)外部類(lèi)的引用);若內(nèi)部類(lèi)無(wú)同名方法可以直接調(diào)用外部類(lèi)的方法。

但外圍類(lèi)無(wú)法直接調(diào)用內(nèi)部類(lèi)的private方法,外部類(lèi)同樣無(wú)法直接調(diào)用其它類(lèi)的private方法。注意:內(nèi)部類(lèi)直接使用外部類(lèi)的方法與該方法的權(quán)限與是否static無(wú)關(guān),它取決于內(nèi)部類(lèi)是否有同名方法。

package innerclass;public class OuterClass { private void outerMethod() { System.out.println('It’s Method of OuterClass'); } public static void main(String[] args) { OuterClass t = new OuterClass(); OuterClass.Innerclass in = t.new Innerclass(); in.innerMethod(); } class Innerclass { public void innerMethod() { OuterClass.this.outerMethod();// 內(nèi)部類(lèi)成員方法與外部類(lèi)成員方法同名時(shí),使用this調(diào)用外部類(lèi)的方法 outerMethod();// 內(nèi)部類(lèi)沒(méi)有同名方法時(shí)執(zhí)行外部類(lèi)的方法 } private void outerMethod() { System.out.println('It’s Method of Innerclass'); } }}

輸出結(jié)果為:

It’s Method of OuterClass

It’s Method of Innerclass

(2)內(nèi)部類(lèi)訪(fǎng)問(wèn)外部類(lèi)的變量必須聲明為final

方法中的局部變量,方法結(jié)束后這個(gè)變量就要釋放掉,final保證這個(gè)變量始終指向一個(gè)對(duì)象。

首先,內(nèi)部類(lèi)和外部類(lèi)其實(shí)是處于同一個(gè)級(jí)別,內(nèi)部類(lèi)不會(huì)因?yàn)槎x在方法中就會(huì)隨著方法的執(zhí)行完畢而跟隨者被銷(xiāo)毀。問(wèn)題就來(lái)了,如果外部類(lèi)的方法中的變量不定義final,那么當(dāng)外部類(lèi)方法執(zhí)行完畢的時(shí)候,這個(gè)局部變量肯定也就被GC了,然而內(nèi)部類(lèi)的某個(gè)方法還沒(méi)有執(zhí)行完,這個(gè)時(shí)候他所引用的外部變量已經(jīng)找不到了。如果定義為final,java會(huì)將這個(gè)變量復(fù)制一份作為成員變量?jī)?nèi)置于內(nèi)部類(lèi)中,這樣的話(huà),由于final所修飾的值始終無(wú)法改變,所以這個(gè)變量所指向的內(nèi)存區(qū)域就不會(huì)變。

注意,若使用JDK1.8,方法中內(nèi)部類(lèi)的方法是可以直接訪(fǎng)問(wèn)外部類(lèi)的方法的局部變量,并且不需要聲明為final類(lèi)型。

public class OuterClass { int num1 = 0;// 成員變量 private void outerMethod() { int num2 = 0;// 方法內(nèi)的局部變量 class Innerclass_1 { public void innerMethod() { System.out.println(num1);// 方法中內(nèi)部類(lèi)的方法,可以正常訪(fǎng)問(wèn)外部類(lèi)的成員變量 System.out.println(num2);// JDK1.8以前,方法中內(nèi)部類(lèi)的方法,不能直接訪(fǎng)問(wèn)外部類(lèi)的方法的局部變量,必須聲明為final } } }}

如果使用JDK1.8以前的版本,Eclipse會(huì)出現(xiàn)如下錯(cuò)誤提示:

Java內(nèi)部類(lèi)和匿名內(nèi)部類(lèi)的用法說(shuō)明

(3)內(nèi)部類(lèi)的實(shí)例化

內(nèi)部類(lèi)實(shí)例化不同于普通類(lèi),普通類(lèi)可以在任意需要的時(shí)候?qū)嵗鴥?nèi)部類(lèi)必須在外層類(lèi)實(shí)例化以后方可實(shí)例化,并與外部類(lèi)建立關(guān)系

因此在外部類(lèi)中的非static方法中,是可以實(shí)例化內(nèi)部類(lèi)對(duì)象

private void outerMethod() { System.out.println('It’s Method of OuterClass'); Innerclass in = new Innerclass();//在外部類(lèi)的outerMethod方法中實(shí)例化內(nèi)部類(lèi)是可以啊 }

但在static方法中,就要注意啦!?。?!不能在static方法中直接new內(nèi)部類(lèi),否則出現(xiàn)錯(cuò)誤:

No enclosing instance of type OuterClass is accessible. Must qualify the allocation with an enclosing instance of type OuterClass (e.g. x.new A() where x is an instance of OuterClass).

這是因?yàn)殪o態(tài)方法是在類(lèi)實(shí)例化之前就可以使用的,通過(guò)類(lèi)名調(diào)用,這時(shí)動(dòng)態(tài)內(nèi)部類(lèi)都還沒(méi)實(shí)例化呢,怎么用,總不能調(diào)用一個(gè)不存在的東西吧。

如果想在Static方法中new內(nèi)部類(lèi),可以把內(nèi)部類(lèi)聲明為Static

public class OuterClass { private void outerMethod() { System.out.println('It’s Method of OuterClass'); } public static void main(String[] args) { Innerclass in = new Innerclass(); in.innerMethod(); } static class Innerclass {//把內(nèi)部類(lèi)聲明為static public void innerMethod() { System.out.println('It’s Method of innerMethod'); } } }

當(dāng)然,一般不使用static的方式,而是推薦這種方法:x.new A() ,其中 x是外部類(lèi)OuterClass的實(shí)例,A是內(nèi)部類(lèi)Innerclass

package innerclass;public class OuterClass { private void outerMethod() { System.out.println('It’s Method of OuterClass'); } public static void main(String[] args) { OuterClass.Innerclass in = new OuterClass().new Innerclass();//使用x.new A()的方式 in.innerMethod(); } class Innerclass { public void innerMethod() { System.out.println('It’s Method of innerMethod'); } }}

x.new A() ,其中 x是外部類(lèi)OuterClass的實(shí)例,A是類(lèi)部類(lèi)Innerclass,當(dāng)然可以拆分如下,這樣就顯然很明白啦:

public static void main(String[] args) { OuterClass out = new OuterClass();//外部實(shí)例 OuterClass.Innerclass in = out.new Innerclass();//外部實(shí)例.new 外部類(lèi) in.innerMethod(); }

(4)什么情況下使用內(nèi)部類(lèi)

典型的情況是,內(nèi)部類(lèi)繼承自某個(gè)類(lèi)或?qū)崿F(xiàn)某個(gè)接口,內(nèi)部類(lèi)的代碼操作創(chuàng)建其的外層類(lèi)的對(duì)象。所以你可以認(rèn)為內(nèi)部類(lèi)提供了某種進(jìn)入其外層類(lèi)的窗口。

使用內(nèi)部類(lèi)最吸引人的原因是:每個(gè)內(nèi)部類(lèi)都能獨(dú)立地繼承自一個(gè)(接口的)實(shí)現(xiàn),所以無(wú)論外層類(lèi)是否已經(jīng)繼承了某個(gè)(接口的)實(shí)現(xiàn),對(duì)于內(nèi)部類(lèi)都沒(méi)有影響。如果沒(méi)有內(nèi)部類(lèi)提供的可以繼承多個(gè)具體的或抽象的類(lèi)的能力,一些設(shè)計(jì)與編程問(wèn)題就很難解決。從這個(gè)角度看,內(nèi)部類(lèi)使得多重繼承的解決方案變得完整。接口解決了部分問(wèn)題,而內(nèi)部類(lèi)有效地實(shí)現(xiàn)了“多重繼承”。

(5)在靜態(tài)方法中實(shí)例化內(nèi)部類(lèi)例子:(內(nèi)部類(lèi)放在靜態(tài)方法中)

package javatest2;public class JavaTest2 { public static void main(String[] args) { class Boy implements Person { public void say() {// 匿名內(nèi)部類(lèi)自定義的方法say System.out.println('say方法調(diào)用'); } @Override public void speak() {// 實(shí)現(xiàn)接口的的方法speak System.out.println('speak方法調(diào)用'); } } Person per = new Boy(); per.speak();// 可調(diào)用 per.say();// 不能調(diào)用 }}interface Person { public void speak();}

per.speak()可調(diào)用,而per.say()不能調(diào)用,這時(shí)因?yàn)閜er是Person對(duì)象,要想調(diào)用子類(lèi)的方法,可以強(qiáng)制向下轉(zhuǎn)型為:((Boy) per).say();或者直接改為Boy per = new Boy();。從中可發(fā)現(xiàn),要想調(diào)用內(nèi)部類(lèi)的自定義的方法,必須通過(guò)內(nèi)部類(lèi)的對(duì)象來(lái)調(diào)用。那么,匿名內(nèi)部類(lèi)連名字都沒(méi)有,怎么調(diào)用內(nèi)部類(lèi)自定義的方法?

(二)匿名內(nèi)部類(lèi)

匿名內(nèi)部類(lèi)也就是沒(méi)有名字的內(nèi)部類(lèi)正因?yàn)闆](méi)有名字,所以匿名內(nèi)部類(lèi)只能使用一次,它通常用來(lái)簡(jiǎn)化代碼編寫(xiě),但使用匿名內(nèi)部類(lèi)還有個(gè)前提條件:必須繼承一個(gè)父類(lèi)或?qū)崿F(xiàn)一個(gè)接口,但最多只能繼承一個(gè)父類(lèi),或?qū)崿F(xiàn)一個(gè)接口。

關(guān)于匿名內(nèi)部類(lèi)還有如下兩條規(guī)則:

1)匿名內(nèi)部類(lèi)不能是抽象類(lèi),因?yàn)橄到y(tǒng)在創(chuàng)建匿名內(nèi)部類(lèi)的時(shí)候,會(huì)立即創(chuàng)建內(nèi)部類(lèi)的對(duì)象。因此不允許將匿名內(nèi)部類(lèi)定義成抽象類(lèi)。

2)匿名內(nèi)部類(lèi)不等定義構(gòu)造器(構(gòu)造方法),因?yàn)槟涿麅?nèi)部類(lèi)沒(méi)有類(lèi)名,所以無(wú)法定義構(gòu)造器,但匿名內(nèi)部類(lèi)可以定義實(shí)例初始化塊,

怎樣判斷一個(gè)匿名類(lèi)的存在啊?看不見(jiàn)名字,感覺(jué)只是父類(lèi)new出一個(gè)對(duì)象而已,沒(méi)有匿名類(lèi)的名字。

先看段偽代碼

abstract class Father(){....}public class Test{ Father f1 = new Father(){ .... } //這里就是有個(gè)匿名內(nèi)部類(lèi)}

一般來(lái)說(shuō),new 一個(gè)對(duì)象時(shí)小括號(hào)后應(yīng)該是分號(hào),也就是new出對(duì)象該語(yǔ)句就結(jié)束了。但是出現(xiàn)匿名內(nèi)部類(lèi)就不一樣,小括號(hào)后跟的是大括號(hào),大括號(hào)中是該new 出對(duì)象的具體的實(shí)現(xiàn)方法。因?yàn)槲覀冎溃粋€(gè)抽象類(lèi)是不能直接new 的,必須先有實(shí)現(xiàn)類(lèi)了我們才能new出它的實(shí)現(xiàn)類(lèi)。上面的偽代碼就是表示new 的是Father的實(shí)現(xiàn)類(lèi),這個(gè)實(shí)現(xiàn)類(lèi)是個(gè)匿名內(nèi)部類(lèi)。

其實(shí)拆分上面的匿名內(nèi)部類(lèi)可為:

class SonOne extends Father{ ... //這里的代碼和上面匿名內(nèi)部類(lèi),大括號(hào)中的代碼是一樣的}public class Test{ Father f1 = new SonOne() ;}

先看一個(gè)例子,體會(huì)一下匿名內(nèi)部類(lèi)的用法:

Java內(nèi)部類(lèi)和匿名內(nèi)部類(lèi)的用法說(shuō)明

運(yùn)行結(jié)果:eat something

可以看到,我們直接將抽象類(lèi)Person中的方法在大括號(hào)中實(shí)現(xiàn)了,這樣便可以省略一個(gè)類(lèi)的書(shū)寫(xiě)。并且,匿名內(nèi)部類(lèi)還能用于接口上

public class JavaTest2 { public static void main(String[] args) { Person per = new Person() { public void say() {// 匿名內(nèi)部類(lèi)自定義的方法say System.out.println('say方法調(diào)用'); } @Override public void speak() {// 實(shí)現(xiàn)接口的的方法speak System.out.println('speak方法調(diào)用'); } }; per.speak();// 可調(diào)用 per.say();// 出錯(cuò),不能調(diào)用 }} interface Person { public void speak();}

這里per.speak()是可以正常調(diào)用的,但per.say()不能調(diào)用,為什么呢?注意Person per = new Person()創(chuàng)建的是Person的對(duì)象,而非匿名內(nèi)部類(lèi)的對(duì)象。其實(shí)匿名內(nèi)部類(lèi)連名字都沒(méi)有,你咋實(shí)例對(duì)象去調(diào)用它的方法呢?但繼承父類(lèi)的方法和實(shí)現(xiàn)的方法是可以正常調(diào)用的,本例子中,匿名內(nèi)部類(lèi)實(shí)現(xiàn)了接口Person的speak方法,因此可以借助Person的對(duì)象去調(diào)用。

若你確實(shí)想調(diào)用匿名內(nèi)部類(lèi)的自定義的方法say(),當(dāng)然也有方法:

(1)類(lèi)似于speak方法的使用,先在Person接口中聲明say()方法,再在匿名內(nèi)部類(lèi)中覆寫(xiě)此方法。

(2)其實(shí)匿名內(nèi)部類(lèi)中隱含一個(gè)匿名對(duì)象,通過(guò)該方法可以直接調(diào)用say()和speak()方法;代碼修改如下:

public class JavaTest2 { public static void main(String[] args) { new Person() { public void say() {// 匿名內(nèi)部類(lèi)自定義的方法say System.out.println('say方法調(diào)用'); } @Override public void speak() {// 實(shí)現(xiàn)接口的的方法speak System.out.println('speak方法調(diào)用'); } }.say();// 直接調(diào)用匿名內(nèi)部類(lèi)的方法 }}interface Person { public void speak();}

補(bǔ)充知識(shí): Java內(nèi)部類(lèi)的定義、如何創(chuàng)建內(nèi)部類(lèi)、內(nèi)部類(lèi)的分類(lèi)、內(nèi)部類(lèi)與外部類(lèi)的關(guān)系

1. 內(nèi)部類(lèi)的基本概念

1.1 內(nèi)部類(lèi)的定義

內(nèi)部類(lèi): 所謂內(nèi)部類(lèi)就是在一個(gè)類(lèi)內(nèi)部進(jìn)行其他類(lèi)結(jié)構(gòu)的嵌套操作。

class Outer{ private String str ='外部類(lèi)中的字符串'; //************************** //定義一個(gè)內(nèi)部類(lèi) class Inner{ private String inStr= '內(nèi)部類(lèi)中的字符串'; //定義一個(gè)普通方法 public void print(){ //調(diào)用外部類(lèi)的str屬性 System.out.println(str); } } //************************** //在外部類(lèi)中定義一個(gè)方法,該方法負(fù)責(zé)產(chǎn)生內(nèi)部類(lèi)對(duì)象并調(diào)用print()方法 public void fun(){ //內(nèi)部類(lèi)對(duì)象 Inner in = new Inner(); //內(nèi)部類(lèi)對(duì)象提供的print in.print(); }}public class Test{ public static void main(String[] args) { //創(chuàng)建外部類(lèi)對(duì)象 Outer out = new Outer(); //外部類(lèi)方法 out.fun(); }}

運(yùn)行結(jié)果:外部類(lèi)中的字符串

但是如果去掉內(nèi)部類(lèi):

class Outer{ private String outStr ='Outer中的字符串'; public String getOutStr() { return outStr; } public void fun(){ //2 //this表示當(dāng)前對(duì)象 Inner in = new Inner(this); //3 in.print(); //5 }}class Inner{ private String inStr= 'Inner中的字符串'; private Outer out; //構(gòu)造注入 public Inner(Outer out) //3 { this.out=out; //4.為Inner中的out變量初始化 } public void print(){ //6 System.out.println(out.getOutStr()); //7 }} public class Test{ public static void main(String[] args) { Outer out = new Outer(); //1. out.fun(); //2. }}

執(zhí)行結(jié)果:Outer中的字符串

但是去掉內(nèi)部類(lèi)之后發(fā)現(xiàn)程序更加難以理解。

1.2 內(nèi)部類(lèi)的優(yōu)缺點(diǎn)

內(nèi)部類(lèi)的優(yōu)點(diǎn):

內(nèi)部類(lèi)與外部類(lèi)可以方便的訪(fǎng)問(wèn)彼此的私有域(包括私有方法、私有屬性)。

內(nèi)部類(lèi)是另外一種封裝,對(duì)外部的其他類(lèi)隱藏。

內(nèi)部類(lèi)可以實(shí)現(xiàn)java的單繼承局限。

內(nèi)部類(lèi)的缺點(diǎn):

結(jié)構(gòu)復(fù)雜。

記錄:使用內(nèi)部類(lèi)實(shí)現(xiàn)多繼承:

class A { private String name = 'A類(lèi)的私有域'; public String getName() { return name; }}class B { private int age = 20; public int getAge() { return age; }}class Outter { private class InnerClassA extends A { public String name() { return super.getName(); }} private class InnerClassB extends B { public int age() { return super.getAge(); }} public String name() { return new InnerClassA().name(); } public int age() { return new InnerClassB().age(); }}public class Test2 { public static void main(String[] args) { Outter outter = new Outter(); System.out.println(outter.name()); System.out.println(outter.age()); }}

Java內(nèi)部類(lèi)和匿名內(nèi)部類(lèi)的用法說(shuō)明

2. 創(chuàng)建內(nèi)部類(lèi)

2.1 在外部類(lèi)外部 創(chuàng)建非靜態(tài)內(nèi)部類(lèi)

語(yǔ)法: 外部類(lèi).內(nèi)部類(lèi) 內(nèi)部類(lèi)對(duì)象 = new 外部類(lèi)().new 內(nèi)部類(lèi)();

舉例: Outer.Inner in = new Outer().new Inner();

2.2 在外部類(lèi)外部 創(chuàng)建靜態(tài)內(nèi)部類(lèi)

語(yǔ)法: 外部類(lèi).內(nèi)部類(lèi) 內(nèi)部類(lèi)對(duì)象 = new 外部類(lèi).內(nèi)部類(lèi)();

舉例: Outer.Inner in = new Outer.Inner();

2.3 在外部類(lèi)內(nèi)部創(chuàng)建內(nèi)部類(lèi)語(yǔ)法

在外部類(lèi)內(nèi)部創(chuàng)建內(nèi)部類(lèi),就像普通對(duì)象一樣直接創(chuàng)建:Inner in = new Inner();

3. 內(nèi)部類(lèi)的分類(lèi)

在Java中內(nèi)部類(lèi)主要分為成員內(nèi)部類(lèi)、靜態(tài)內(nèi)部類(lèi)、方法內(nèi)部類(lèi)、匿名內(nèi)部類(lèi)

3.1 成員內(nèi)部類(lèi)

類(lèi)比成員方法

成員內(nèi)部類(lèi)內(nèi)部不允許存在任何static變量或方法 正如成員方法中不能有任何靜態(tài)屬性 (成員方法與對(duì)象相關(guān)、靜態(tài)屬性與類(lèi)有關(guān))

class Outer { private String name = 'test'; public static int age =20; class Inner{ public static int num =10; public void fun() { System.out.println(name); System.out.println(age); } }}public class Test{ public static void main(String [] args) {}}

Java內(nèi)部類(lèi)和匿名內(nèi)部類(lèi)的用法說(shuō)明

2. 成員內(nèi)部類(lèi)是依附外部類(lèi)的,只有創(chuàng)建了外部類(lèi)才能創(chuàng)建內(nèi)部類(lèi)。

3.2 靜態(tài)內(nèi)部類(lèi)

關(guān)鍵字static可以修飾成員變量、方法、代碼塊、其實(shí)還可以修飾內(nèi)部類(lèi),使用static修飾的內(nèi)部類(lèi)我們稱(chēng)之為靜態(tài)內(nèi)部類(lèi),靜態(tài)內(nèi)部類(lèi)和非靜態(tài)內(nèi)部類(lèi)之間存在一個(gè)最大的區(qū)別,非靜態(tài)內(nèi)部類(lèi)在編譯完成之后會(huì)隱含的保存著一個(gè)引用,該引用是指向創(chuàng)建它的外圍類(lèi),但是靜態(tài)類(lèi)沒(méi)有。沒(méi)有這個(gè)引用就意味著:

1.靜態(tài)內(nèi)部類(lèi)的創(chuàng)建不需要依賴(lài)外部類(lèi)可以直接創(chuàng)建。

2.靜態(tài)內(nèi)部類(lèi)不可以使用任何外部類(lèi)的非static類(lèi)(包括屬性和方法),但可以存在自己的成員變量。

class Outer { public String name = 'test'; private static int age =20; static class Inner{ private String name; public void fun() { System.out.println(name); System.out.println(age); } }}public class Test{ public static void main(String [] args) { Outer.Inner in = new Outer.Inner(); }}

Java內(nèi)部類(lèi)和匿名內(nèi)部類(lèi)的用法說(shuō)明

3.3 方法內(nèi)部類(lèi)

方法內(nèi)部類(lèi)顧名思義就是定義在方法里的類(lèi)

1.方法內(nèi)部類(lèi)不允許使用訪(fǎng)問(wèn)權(quán)限修飾符(public、private、protected)均不允許。

class Outer{ private int num =5; public void dispaly(final int temp) { //方法內(nèi)部類(lèi)即嵌套在方法里面 public class Inner{ } }}public class Test{ public static void main(String[] args) {}}

Java內(nèi)部類(lèi)和匿名內(nèi)部類(lèi)的用法說(shuō)明

2. 方法內(nèi)部類(lèi)對(duì)外部完全隱藏,除了創(chuàng)建這個(gè)類(lèi)的方法可以訪(fǎng)問(wèn)它以外,其他地方均不能訪(fǎng)問(wèn) (換句話(huà)說(shuō)其他方法或者類(lèi)都不知道有這個(gè)類(lèi)的存在)方法內(nèi)部類(lèi)對(duì)外部完全隱藏,出了創(chuàng)建這個(gè)類(lèi)的方法可以訪(fǎng)問(wèn)它,其他地方均不能訪(fǎng)問(wèn)。

3. 方法內(nèi)部類(lèi)如果想要使用方法形參,該形參必須使用final聲明(JDK8形參變?yōu)殡[式final聲明)

class Outer{ private int num =5; //普通方法 public void dispaly(int temp) { //方法內(nèi)部類(lèi)即嵌套在方法里面 class Inner{ public void fun() {System.out.println(num);temp++;System.out.println(temp); } } //方法內(nèi)部類(lèi)在方法里面創(chuàng)建 new Inner().fun(); }}public class Test{ public static void main(String[] args) { Outer out = new Outer(); out.dispaly(2); }}

Java內(nèi)部類(lèi)和匿名內(nèi)部類(lèi)的用法說(shuō)明

3.4 匿名內(nèi)部類(lèi)

匿名內(nèi)部類(lèi)就是一個(gè)沒(méi)有名字的方法內(nèi)部類(lèi),因此特點(diǎn)和方法與方法內(nèi)部類(lèi)完全一致,除此之外,還有自己的特點(diǎn):

1.匿名內(nèi)部類(lèi)必須繼承一個(gè)抽象類(lèi)或者實(shí)現(xiàn)一個(gè)接口。

2.匿名內(nèi)部類(lèi)沒(méi)有類(lèi)名,因此沒(méi)有構(gòu)造方法。

//匿名內(nèi)部類(lèi)//聲明一個(gè)接口interface MyInterface { //接口中方法沒(méi)有方法體 void test();}class Outer{ private int num = 5; public void dispaly(int temp) { //匿名內(nèi)部類(lèi),匿名的實(shí)現(xiàn)了MyInterface接口 //隱藏的class聲明 new MyInterface() { public void test() {System.out.println('匿名實(shí)現(xiàn)MyInterface接口');System.out.println(temp); } }.test(); }}public class Test{ public static void main(String[] args) { Outer out = new Outer(); out.dispaly(3); }}

Java內(nèi)部類(lèi)和匿名內(nèi)部類(lèi)的用法說(shuō)明

4. 內(nèi)部類(lèi)與外部類(lèi)的關(guān)系

對(duì)于非靜態(tài)的內(nèi)部類(lèi),內(nèi)部類(lèi)的創(chuàng)建依賴(lài)外部類(lèi)的實(shí)例對(duì)象,在沒(méi)有外部類(lèi)實(shí)例之前是無(wú)法創(chuàng)建內(nèi)部類(lèi)的。內(nèi)部類(lèi)可以直接訪(fǎng)問(wèn)外部類(lèi)的元素(包括私有域)—外部類(lèi)在內(nèi)部類(lèi)之前創(chuàng)建,創(chuàng)建內(nèi)部類(lèi)時(shí)會(huì)將外部類(lèi)的對(duì)象傳入

class Outer{ //成員變量 與對(duì)象有關(guān) private String msg; private int age; //-------------------------- class Inner{ public void dispaly() { //此處有一個(gè)隱藏的Outer.this msg = 'test'; age = 20; System.out.println(msg); System.out.println(age); } } //-------------------------- public void test() { Inner in = new Inner(); in.dispaly(); }}public class Test{ public static void main(String[] args) { Outer out = new Outer(); out.test(); }}

外部類(lèi)可以通過(guò)內(nèi)部類(lèi)的引用間接訪(fǎng)問(wèn)內(nèi)部類(lèi)元素 ? -要想訪(fǎng)問(wèn)內(nèi)部類(lèi)屬性,必須先創(chuàng)建內(nèi)部類(lèi)對(duì)象

class Outer{ public void dispaly() { //外部類(lèi)通過(guò)創(chuàng)建內(nèi)部類(lèi)的對(duì)象間接訪(fǎng)問(wèn)內(nèi)部類(lèi)元素 Inner in = new Inner(); in.dispaly(); } class Inner{ public void dispaly() { System.out.println('內(nèi)部類(lèi)'); } }}public class Test1{ public static void main(String[] args) { Outer out = new Outer(); out.dispaly(); }}

內(nèi)部類(lèi)是一個(gè)相對(duì)獨(dú)立的個(gè)體,與外部類(lèi)沒(méi)有關(guān)系。

以上這篇Java內(nèi)部類(lèi)和匿名內(nèi)部類(lèi)的用法說(shuō)明就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Java
相關(guān)文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
久久人人超碰精品| 成人午夜激情影院| 91亚洲大成网污www| 欧美精品丝袜中出| 免费xxxx性欧美18vr| 久久久久欧美精品| 一区二区三区资源| 午夜精品剧场| 亚洲国产精品成人久久综合一区 | 日本不卡高清视频| 色哟哟在线观看一区二区三区| 亚洲国产精品尤物yw在线观看| 最新国产拍偷乱拍精品 | 天堂蜜桃91精品| 色又黄又爽网站www久久| 美女www一区二区| 欧美日本韩国一区二区三区视频 | 91福利在线导航| 日韩成人精品在线观看| 欧美又粗又大又爽| 国产伦精品一区二区三区视频青涩| 日韩一级成人av| www.日韩精品| 国产精品毛片久久久久久| 99这里有精品| 香蕉久久夜色精品国产使用方法| 久久综合一区| 国产一区二三区| 国产一区二区久久| 欧美一区二区三区日韩| 成人黄色综合网站| 国产调教视频一区| 亚洲茄子视频| 亚洲成年人影院| 欧美午夜寂寞影院| 成人av在线一区二区| 国产精品欧美经典| 亚洲欧美大片| 国产曰批免费观看久久久| 精品国产区一区| 亚洲黄色一区| 日本视频一区二区三区| 欧美一区二区三区性视频| 色综合网色综合| 亚洲私人黄色宅男| 可以看av的网站久久看| 国产一区二区三区四区五区美女 | 欧美日韩三级| 亚洲国产精品自拍| 欧美色男人天堂| av不卡免费电影| 亚洲品质自拍视频| 欧美亚洲一区三区| 国产成人aaa| 椎名由奈av一区二区三区| 性欧美xxxx大乳国产app| 日本午夜一区二区| 欧美第一区第二区| 欧美三级第一页| 一区二区久久久| 欧美精品在线观看播放| 91小视频免费看| 亚洲黄色av一区| 一区二区日本视频| 精品一区二区三区免费视频| 精品久久免费看| 99精品国产在热久久婷婷| 麻豆国产一区二区| 国产午夜精品久久| 色妞www精品视频| 99视频精品全部免费在线| 亚洲欧美激情插 | 99在线精品免费| 一区二区三区国产精华| 欧美午夜电影在线播放| 99麻豆久久久国产精品免费| 亚洲精品ww久久久久久p站| 制服丝袜在线91| 国产综合自拍| 久久av老司机精品网站导航| 久久久av毛片精品| 久久综合导航| 色综合色综合色综合色综合色综合| 亚洲少妇30p| 91精品国产乱码久久蜜臀| 亚洲激情二区| 国产不卡免费视频| 亚洲成人在线免费| 久久免费午夜影院| 欧美亚洲综合在线| 亚洲国产精品一区制服丝袜 | 六月婷婷色综合| 国产亚洲精久久久久久| 91九色02白丝porn| 午夜国产欧美理论在线播放 | 国产91精品欧美| 亚洲午夜激情网页| 久久久亚洲精华液精华液精华液| 午夜在线视频一区二区区别| 成人深夜福利app| 丝瓜av网站精品一区二区| 国产欧美一区二区精品性色超碰 | 日韩**一区毛片| 国产精品免费视频观看| 欧美久久久一区| 亚洲色诱最新| 97久久超碰国产精品电影| 麻豆极品一区二区三区| 一区二区在线看| 久久五月婷婷丁香社区| 欧美午夜片在线观看| 国产午夜久久| 欧美高清日韩| 国产高清一区日本| 日韩av一区二| 亚洲另类中文字| 久久久91精品国产一区二区精品| 久久久久久婷| 日韩亚洲视频在线| 色综合色狠狠天天综合色| 韩国毛片一区二区三区| 亚洲成人福利片| 中文字幕一区av| 久久亚洲综合av| 欧美精品色一区二区三区| 色呦呦日韩精品| 亚洲一区二区三区四区五区午夜| 欧美日韩在线大尺度| 成人黄色免费短视频| 精品一区在线看| 日韩精品欧美精品| 亚洲精品高清视频在线观看| 久久久精品日韩欧美| 欧美一卡二卡在线观看| 欧美视频在线观看一区二区| 夜夜嗨一区二区三区| 国产精品xvideos88| 波多野洁衣一区| 国产成人综合精品三级| 麻豆精品视频在线观看免费| 婷婷丁香久久五月婷婷| 亚洲自拍都市欧美小说| **网站欧美大片在线观看| 国产网红主播福利一区二区| 久久综合色天天久久综合图片| 日韩一二在线观看| 91精品国产品国语在线不卡| 欧美综合欧美视频| 久久九九国产| 亚洲一区三区电影在线观看| 亚洲麻豆av| 悠悠资源网久久精品| 欧美日韩一区二区三区在线观看免| av激情综合网| 菠萝蜜视频在线观看一区| 成人黄色国产精品网站大全在线免费观看| 久久精品国产亚洲5555| 青青国产91久久久久久| 五月天一区二区三区| 午夜精品视频一区| 午夜一区二区三区在线观看| 亚洲在线一区二区三区| 亚洲少妇最新在线视频| 综合亚洲深深色噜噜狠狠网站| 欧美韩日一区二区三区四区| 国产欧美一区二区在线观看| 国产精品美女一区二区| 国产精品久久久久三级| 国产精品国产三级国产普通话蜜臀 | 91啪亚洲精品| 91影院在线观看| 欧美 日韩 国产在线| 欧美不卡在线| 国产一区二区三区四区三区四 | 国产精品另类一区| 国产精品久久久久三级| 亚洲欧洲av在线| 亚洲精品午夜久久久| 亚洲最新在线观看| 一区二区三区日韩| 亚洲欧美另类图片小说| 亚洲国产另类av| 奇米影视一区二区三区| 国产精品理伦片| 伊人开心综合网| 日韩国产精品久久| 老司机精品视频在线| 精品在线你懂的| 高清不卡在线观看av| 一区二区三区四区av| 日韩主播视频在线| 九九视频精品免费| 国产福利电影一区二区三区| thepron国产精品| 色综合久久综合| 亚洲东热激情| 久久在线91| 69p69国产精品| 久久久久久电影| 亚洲欧洲中文日韩久久av乱码|