java日常學習:內部類、區域性內部類、匿名內部類
阿新 • • 發佈:2019-01-26
java程式碼塊
內部類
內部類: 在一個類的內部定義另外一個類,那麼另外一個類則稱作為內部類 。
內部類的class檔名: 外部類$內部類.class
成員內部類:
成員內部類的訪問方式:
方式一: 在外部類提供一個方法建立內部類的物件進行訪問。
方式二:在其他類中直接建立內部的物件進行訪問。 格式: 外部類.內部類 變數名 = new 外部類().new 內部類(); 注意:靜態成員內部類在其他類建立物件的格式: 外部類.內部類 變數名 = new 外部類.內部類();
內部類的好處: 直接訪問外部類的所有成員。
應用場景: 我們在描述A事物的時候,A事物內部還維護了另外一個B事物,
而且B事物還必須 要訪問到A事物的成員,那麼這時候我們就可以使用內部類描述B事物。
比如: 人– 心臟 . 圖形化介面程式設計
成員內部類要注意的細節:
1. 內部類可以直接訪問外部類的所有成員。
2. 內部類與外部類存在同名的成員時, 在內部類中預設是訪問內部類的成員, 可以通過”外部類.this.成員”進行指定訪問外部類的成員。
3. 私有的成員內部類只能通過在外部類提供一個公共的方法進行訪問。 在其他類無法訪問。
4. 如果一個成員內部類定義了靜態的成員,那麼該類也必須使用static修飾。
疑問:為什麼如果一個成員內部類定義了靜態的成員,那麼該類也必須使用static修飾 ???
靜態的成員變數是不依賴物件而存在的
區域性內部類
區域性內部類:在一個方法內部定義的類稱作為區域性內部類。
區域性內部類要注意的細節:
1. 如果區域性內部類要訪問區域性變數,那麼區域性變數必須使用final去修飾。
匿名內部類
匿名內部類:沒有類名的內部類就稱作為匿名內部類。
匿名內部類的好處: 簡化書寫。
匿名內部類的使用前提: 必須存在繼承或者實現的關係。
注意的事項:
1. 匿名內部類只是沒有類名而已,其他的一切成員都是具備的。
實現關係下的匿名內部類:
interface Dao{
public void add();
}
class Outer{
//實現關係下的匿名內部類
public void show(){
//這裡建立的不是Dao介面的物件,建立的是Dao介面實現類的物件。
new Dao(){
public void add(){
System.out.println("新增成功..");
}
}.add();
}
}
練習
/*
需求: 定義一個區域性內部類繼承Animal,建立物件呼叫run方法。
*/
abstract class Animal {
public abstract void run();
public abstract void sleep();
}
class Outer {
public void print (){
/*
class Cat{
public void run(){
System.out.println("小貓跑的快!");
}
public void sleep(){
System.out.println("小貓在睡覺!");
}
}
//建立區域性內部類的物件
Cat c = new Cat();
c.run();
c.sleep();
*/
//匿名內部類只是沒有類名而已,其他的一切成員都是具備的;
//多型
Animal a = new Animal(){ // 這裡建立的並不是Animal的物件,建立的是Animal的子類物件,只不過其子類目前沒有類名借用了ANimal名字而已;
//匿名內部類的成員;
String name; //證明匿名內部成員是可以具備的;
public void run(){
System.out.println("小貓跑的快!");
}
public void sleep(){
System.out.println("小貓在睡覺!");
} //在不宣告變數接收的情況下,這裡可以直接 .run/.sleep;
};
a.run();
a.sleep();
}
}
class Demo2
{
public static void main(String[] args)
{
new Outer().print();
}
}
用於平時自己複習回顧,如有錯誤,歡迎指正