Java基礎——面向物件(六)內部類
阿新 • • 發佈:2019-01-10
一、概述
一個類巢狀在另一個類當中。編譯後生成檔案:類$內部類.class。
class Outer
{
class Inner
{
}
}
特點:
1.內部類可以直接訪問外部類中的成員。
2.外部類要訪問內部類,必須建立內部類的物件。
什麼時候使用?
一般用於類的設計。分析事物時,發現該實物描述中還有事物,而且這個事物還在訪問被描述事物的內容。
二、修飾符與使用
1.內部類可以使用修飾符
static:此時內部類是靜態的,相當於一個外部類。注意:當內部類有靜態成員,內部類必須是靜態的。
2.使用格式
//外部訪問 class Demo{ public static void main(String[] args){ //如果是public Outer.Inner in = new Outer().new Inner(); //如果是static Outer.Inner in = new Outer.Inner(); } } //內部訪問 class Outer{ class Inner{ } void Method(){ Inner in = new Inner(); } }
三、實現細節
class Outer { int num = 3; class Inner { int num = 4; void show() { int num = 5; //注意這裡Inner.this或者Outer.this表示的num不同 System.out.println(Outer.this.num); } } void method() { new Inner().show(); } } class InnerClassDemo2 { public static void main(String[] args) { new Outer().method(); } }
思考:為什麼內部類能直接訪問外部類中的成員呢?
那是因為內部類持有了外部類的成員。 外部類名.this
四、區域性內部類——方法中的類
class Outer
{
int num = 3;
Object method()
{
final int x = 9;
class Inner
{
public String toString()
{
return "show ..."+x;//呼叫只能被final修飾的變數-》規則
}
}
Object in = new Inner();
return in;//0x0045
// in.show();
}
}
class InnerClassDemo3
{
public static void main(String[] args)
{
Outer out = new Outer();
Object obj = out.method();
System.out.println(obj);
}
}
上面的出規則:區域性內部類只能呼叫final修飾的區域性變數。
原因:方法執行完會被彈棧,但是申請到的物件還在主程式。
五、匿名內部類——內部類的簡寫格式
規則:內部類必須繼承或者實現一個外部類或者介面。
abstract class Demo
{
abstract void show();
}
class Outer
{
int num = 4;
/*
class Inner extends Demo
{
void show()
{
System.out.println("show ..."+num);
}
}
*/
public void method()
{
//new Inner().show();
new Demo()//匿名內部類。
{
void show()
{
System.out.println("show ........"+num);
}
}.show();
}
}
匿名內部類:其實就是一個匿名子類物件。
格式:new 父類or介面(){子類內容}
子類內容:需要全部實現
六、應用
public void method()
{
// Inner in = new Inner();
// in.show1();
// in.show2();
Inter in = new Inter()
{
public void show1()
{
}
public void show2()
{
}
};
in.show1();
in.show2();
}
使用場景一:當函式引數是介面型別時,且介面中的方法不超過三個。可以使用匿名內部類作為實際引數進行傳遞。
//使用場景之一
interface Inter(){
public void show1();
public void show2();
}
class InnerClassDemo5
{
public static void main(String[] args)
{
System.out.println("Hello World!");
show(new Inter()
{
public void show1(){}
public void show2(){}
});
}
注意:main裡面需要的都是靜態的