假設(shè)外部類叫Out,內(nèi)部類叫In,那么我們可以使用Out.In in = new Out().new In()來(lái)實(shí)例化內(nèi)部類的對(duì)象,具體示例代碼如下:
創(chuàng)新互聯(lián)主要從事網(wǎng)站制作、成都網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)遼寧,10余年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來(lái)電咨詢建站服務(wù):13518219792
class Out {
private int age = 12;
class In {
private int age = 13;
public void print() {
int age = 14;
System.out.println("局部變量:" + age);
System.out.println("內(nèi)部類變量:" + this.age);
System.out.println("外部類變量:" + Out.this.age);
}
}
}
public class Demo {
public static void main(String[] args) {
Out.In in = new Out().new In();
in.print();
}
}
Java中的幾種內(nèi)部類:
成員內(nèi)部類:作為外部類的一個(gè)成員存在,與外部類的屬性、方法并列。當(dāng)某個(gè)類除了他的外部類,不會(huì)被其他類使用時(shí)應(yīng)該選擇使用成員內(nèi)部類。
局部?jī)?nèi)部類:局部?jī)?nèi)部類定義在外部類的某個(gè)代碼塊或方法塊中。如果只會(huì)在某個(gè)方法或塊中創(chuàng)建這個(gè)類的對(duì)象,就可以使用局部?jī)?nèi)部類。
匿名內(nèi)部類:匿名內(nèi)部類一般定義在需要傳遞接口或回調(diào)的的地方,一個(gè)匿名內(nèi)部類一定是在new的后面,用其隱含實(shí)現(xiàn)一個(gè)接口或繼承一個(gè)類。假如只需要?jiǎng)?chuàng)建這個(gè)類的一個(gè)對(duì)象不需要知道其實(shí)際類型(不需要使用到類名),那么就可以使用匿名內(nèi)部類。
靜態(tài)內(nèi)部類:和成員內(nèi)部類一樣,作為外部類的一個(gè)成員存在,與外部類的屬性、方法并列,只不過(guò)在聲明類的時(shí)候加入了static關(guān)鍵字。有時(shí)候,使用內(nèi)部類只是為了把一個(gè)類隱藏在另外一個(gè)類的內(nèi)部,并不需要內(nèi)部類引用外圍類對(duì)象。這時(shí)可以使用靜態(tài)內(nèi)部類,以便取消產(chǎn)生對(duì)外部類的引用。
把類放在方法內(nèi)
class Outer {
public void doSomething(){
class Inner{
public void seeOuter(){
}
}
}
}
(1)、方法內(nèi)部類只能在定義該內(nèi)部類的方法內(nèi)實(shí)例化,不可以在此方法外對(duì)其實(shí)例化。
(2)、方法內(nèi)部類對(duì)象不能使用該內(nèi)部類所在方法的非final局部變量。
因?yàn)榉椒ǖ木植孔兞课挥跅I?,只存在于該方法的生命期?nèi)。當(dāng)一個(gè)方法結(jié)束,其棧結(jié)構(gòu)被刪除,局部變量成為歷史。但是該方法結(jié)束之后,在方法內(nèi)創(chuàng)建的內(nèi)部類對(duì)象可能仍然存在于堆中!例如,如果對(duì)它的引用被傳遞到其他某些代碼,并存儲(chǔ)在一個(gè)成員變量?jī)?nèi)。正因?yàn)椴荒鼙WC局部變量的存活期和方法內(nèi)部類對(duì)象的一樣長(zhǎng),所以內(nèi)部類對(duì)象不能使用它們。
下面是完整的例子:
class Outer {
public void doSomething(){
final int a =10;
class Inner{
public void seeOuter(){
System.out.println(a);
}
}
Inner in = new Inner();
in.seeOuter();
}
public static void main(String[] args) {
Outer out = new Outer();
out.doSomething();
}
}