黑馬程序員 Java面向對象——(匿名)內部類

面向對象

內部類:

將一個類定義在另一個類的裏面,對裏面那個類就稱爲內部類(內置類,嵌套類)。

簡單的說就是類中還有一個類,就是內部類。

字節碼文件名:外部類名$內部類名.class

內部類訪問特點:

1,內部類可以直接訪問外部類中的成員,包括私有成員。

2,而外部類要訪問內部類中的成員必須要建立內部類的對象。

一般用於類的設計。

分析事物時,發現該事物描述中還有事物,而且這個事物還在訪問被描述事物的內容。

這時就是還有的事物定義成內部類來描述。

直接訪問外部類中的內部類中的成員。

外部類名.內部類名 = new 外部類對象.new 內部類對象;

Outer.Inner in = new Outer().new Inner();

in.method();

如果內部類是靜態的。 相當於一個外部類

外部類名.內部類名 = new 外部類對象.內部類;

Outer.Inner in = new Outer.Inner();

in.method();

如果內部類是靜態的,成員是靜態的。

外部類名.內部類名.靜態函數名;

Outer.Inner.function();

注:如果內部類中定義了靜態成員,該內部類也必須是靜態的。

爲什麼內部類能直接訪問外部類中成員呢?

那是因爲內部類持有了外部類的引用。  外部類名.this

內部類可以存放在局部位置上。(也就是定義在外部類的成員函數裏面,主函數也是函數哦)
內部類在局部位置上只能訪問局部中被final修飾的局部變量。原因:

由於內部類可能擴大局部變量的作用域,如果再加上這個被內部類訪問的局部變量沒有使用final修飾,也就是說這個變量的值可以隨時改變,那將引起極大的混亂,因此java編譯器要求所有被內部類訪問的局部變量必須使用final修飾符修飾。

class Outer {

private Innter inner = new Outer.Inner();

private Outer outer = new Outer();

static class Inner{

public void run(){

System.out.println("Inner class run");

}

public void method(){

System.out.println("Inner method run")

}

public static void show(){

System.out.println("Inner static show run");

}

}

public void method(){

System.out.println("Outer method run");

}

public Innter getInnterInstance(){

return inner;

}

public static Outer getOuterInstance(){

return outer;

}

}

class Test{

public static void main(String[] args){

//打印外部類的method方法

Outer.getOuterInstance().method();

//打印內部類的method方法

Outer.getOuterInstance().getInnterInstance().method();

}

}

/*

代碼都是自己想到就敲出來的,如果有哪個地方敲錯了,還請別見怪,如果有哪裏寫的不對的地方,請評論我的博客,請多多指教。

一天的學習量也不小,所以有時候也會敲錯個別字的,知道哪裏寫錯了或者寫的不好請多多評論。新長城會虛心接收並及時改正的。

*/

匿名內部類:

匿名內部類。就是內部類的簡寫格式。

其實匿名內部類就是一個匿名子類對象,而且這個對象有點胖,也可以理解爲,帶內容的對象。

必須有前提:內部類必須繼承或者實現一個外部類或者接口。(因爲內部類是用父類的名字創建對象)

匿名內部類:其實就是一個匿名子類對象。

匿名內部類格式new 父類或者(or)接口(){子類成員}


通常的使用場景之一

當函數參數是接口類型時,而且接口中的方法不超過三個。

可以用匿名內部類作爲實際參數進行傳遞。

匿名內部類應用:

/*定義一個接口, 2個抽象方法(method two)*/

interface Inter  {  

      void show1(); //默認是public abstract權限修飾

      void show2();  

}  

class Test  {  

public static void main(String[] args){

/*

調用show方法show方法接口一個Inter對象,並將匿名內部類對象當成參數進行傳遞

*/

show(new Inter()  {  

/*

由於Inter父類的方法不超過三個所以使用匿名內部類進行子類實例化。複寫父類的2個方法

*/

public void show1(){

System.out.println("show1 run");

}  

public void show2(){

System.out.println("show2 run");

}  

}); 

}  

public static void show(Inter in){  

/*

調用Inter類的方法,子類實例化過一次,被子類進行了複寫動作,所以打印的是子類實例化後的方法。

*/

in.show1();  //打印show1 run


in.show2();  //打印show2 run

}  

}  

內部類 匿名內部類注意之細節:

abstract class Inner{

public abstract void method();

}

class Test {

//創建一個Test的內部類Innter對象。

private Inner inner =/*this.*/new TestInner();//從這裏可以看出來,創建內部類前面省略了一個this

/*

Inner內部類 method內部類方法

但是我們學過匿名內部類,可以用匿名內部類的形式進行復寫。

new Inner(){

public void method(){

System.out.println("Inner Method Run");

}


}代表是的Inner類的子類對象,並對父類的方法進行了複寫。

*/

class TestInner extends Inner {

/*

內部類的出來再一次打破了單繼承的侷限性.匿名內部類更加對代碼進行了簡化。

*/

public void method(){

System.out.println("Inner Method Run");

}

}

/*

由於主函數調用非靜態方法,所以只能創建對象。

*/

public static void main(String[] args) {

new Test().method().method();

/*Object obj = new Object (){

public void show(){

System.out.println("Object Show Run");

}

}

創建Object的子類對象,但是Object類中的沒有show方法,所以編譯失敗。多態看的是引用型變量對象中是否有對應的方法。

*/

}

/*

返回內部類對象。

*/

public Inner method(){

return inner;

}

}

/*

思考這條代碼思考了一小時,更加對匿名內部類 和內部了有了更深一層的瞭解,知道了其中的細節。更加理解了什麼叫深思熟濾。

*

發佈了43 篇原創文章 · 獲贊 24 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章