內(nèi)部類

內(nèi)部類:在一個類內(nèi)部定義的類

內(nèi)部類屬于外部類的一個成員,所以內(nèi)部類可以直接使用外部類的成員

直接創(chuàng)建內(nèi)部類的對象(Outer.inner in = new Outer.new inner()<非靜態(tài)內(nèi)部類>&&new Outer.inner()<靜態(tài)內(nèi)部類>)

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

static class 類名(內(nèi)部類含有靜態(tài)成員,那么內(nèi)部類必須是靜態(tài)的)

靜態(tài)的只能訪問靜態(tài)的

內(nèi)部類得到外部類對象 --- >> 外部類名.this

內(nèi)部類得到外部類對象中的成員 --- >> 外部類名.this.成員


局部內(nèi)部類:在函數(shù)內(nèi)部定義的類

當(dāng)局部內(nèi)部類使用了其所在函數(shù)的局部變量時,該局部變量必須是final的(被final修飾的變量被放在方法區(qū)的常量池中,修飾引用對象時,其應(yīng)用對象不能修改但其屬性可以被修改)


java中的匿名內(nèi)部類總結(jié)

匿名內(nèi)部類也就是沒有名字的內(nèi)部類

正因為沒有名字,所以匿名內(nèi)部類只能使用一次,它通常用來簡化代碼編寫

但使用匿名內(nèi)部類還有個前提條件:必須繼承一個父類或?qū)崿F(xiàn)一個接口

實例1:不使用匿名內(nèi)部類來實現(xiàn)抽象方法

abstract class Person {

public abstract void eat();

}

class Child extends Person {

public void eat() {

System.out.println("eat something");

}

}

public class Demo {

public static void main(String[] args) {

Person p =new Child();

p.eat();

}

}

運行結(jié)果:eat something

可以看到,我們用Child繼承了Person類,然后實現(xiàn)了Child的一個實例,將其向上轉(zhuǎn)型為Person類的引用

但是,如果此處的Child類只使用一次,那么將其編寫為獨立的一個類豈不是很麻煩?

這個時候就引入了匿名內(nèi)部類

實例2:匿名內(nèi)部類的基本實現(xiàn)

abstract class Person {

public abstract void eat();

}

public class Demo {

public static void main(String[] args) {

Person p =new Person() {

public void eat() {

System.out.println("eat something");

}

};

p.eat();

}

}

運行結(jié)果:eat something

可以看到,我們直接將抽象類Person中的方法在大括號中實現(xiàn)了

這樣便可以省略一個類的書寫

并且,匿名內(nèi)部類還能用于接口上

實例3:在接口上使用匿名內(nèi)部類

interfacePerson {

publicvoideat();

}

publicclassDemo {

publicstaticvoidmain(String[] args) {

Person p =newPerson() {

publicvoideat() {

System.out.println("eat something");

}

};

p.eat();

}

}

運行結(jié)果:eat something

由上面的例子可以看出,只要一個類是抽象的或是一個接口,那么其子類中的方法都可以使用匿名內(nèi)部類來實現(xiàn)

最常用的情況就是在多線程的實現(xiàn)上,因為要實現(xiàn)多線程必須繼承Thread類或是繼承Runnable接口

實例4:Thread類的匿名內(nèi)部類實現(xiàn)

publicclassDemo {

publicstaticvoidmain(String[] args) {

Thread t =newThread() {

publicvoidrun() {

for(inti =1; i <=5; i++) {

System.out.print(i +" ");

}

}

};

t.start();

}

}

運行結(jié)果:1 2 3 4 5

實例5:Runnable接口的匿名內(nèi)部類實現(xiàn)

publicclassDemo {

publicstaticvoidmain(String[] args) {

Runnable r =newRunnable() {

publicvoidrun() {

for(inti =1; i <=5; i++) {

System.out.print(i +" ");

}

}

};

Thread t =newThread(r);

t.start();

}

}

運行結(jié)果:1 2 3 4 5

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Java 內(nèi)部類 分四種:成員內(nèi)部類、局部內(nèi)部類、靜態(tài)內(nèi)部類和匿名內(nèi)部類。 1、成員內(nèi)部類: 即作為外部類的一個成...
    ikaroskun閱讀 1,355評論 0 13
  • 內(nèi)部類: 在一個類里面還有一個類,Outer外部類、Inner內(nèi)部類 內(nèi)部類的訪問規(guī)則: 內(nèi)部類可以直接訪問外部類...
    kiyoko_pq閱讀 222評論 0 0
  • 將一個類的定義放在另一個類的定義內(nèi)部,這就是內(nèi)部類。內(nèi)部類是個很有用的特性,它允許你把一些邏輯相關(guān)的類組織在一起,...
    一根煙的彈跳閱讀 288評論 0 0
  • 內(nèi)部類是指在一個外部類的內(nèi)部再定義一個類。類名不需要和文件夾相同。(注意,這里的外部類就是最常見的普通類,只是為了...
    海天一樹X閱讀 2,576評論 0 2
  • 內(nèi)部類(Nested Class)仍是獨立的類,只不過被包含于其他類中。編譯之后內(nèi)部類會被編譯成獨立的.class...
    七弦桐語閱讀 489評論 0 4

友情鏈接更多精彩內(nèi)容