Java允許把一個類定義在另一個類或者方法的內(nèi)部,我們稱為內(nèi)部類释涛,內(nèi)部類一般分為四種:類中類涝婉,方法內(nèi)部類哥力,匿名內(nèi)部類和靜態(tài)內(nèi)部類。下面就來了解一下這四種內(nèi)部類的用法墩弯。
類中類
顧名思義吩跋,就是在一個類中又定義了一個類蟀淮,就像這樣:
public class OutterClass {
private String name;
public OutterClass(String name) {
super();
this.name = name;
}
class Inner{
private int id;
public void show(){
System.out.println("我是內(nèi)部類");
}
}
}
其實可以把Inner
理解為Outter
類中的一個成員變量,在Inner
中可以訪問Outter
中的任意屬性和方法(包括private
和static
)钞澳。需要注意的是怠惶,當內(nèi)部類和外部類有一個同名的屬性或者方法時,你在內(nèi)部類中調(diào)用的話會優(yōu)先調(diào)用內(nèi)部類中的屬性或方法轧粟,如果要訪問外部類中的屬性策治,可以用Outter.this.name
來訪問,上demo:
public class OutterClass {
private String name = "out";
public OutterClass(String name) {
super();
this.name = name;
}
class Inner{
private String name = "in";
public void show(){
//訪問外部類的name
System.out.println(OutterClass.this.name);
}
}
}
內(nèi)部類可以任意訪問外部類兰吟,但是外部類要訪問內(nèi)部類就沒有那么容易了通惫,必須先創(chuàng)建一個內(nèi)部類的對象,再通過這個對象來訪問內(nèi)部類中的屬性或方法
public class OutterClass {
private String name = "out";
public OutterClass(String name) {
super();
this.name = name;
}
//創(chuàng)建一個內(nèi)部類的對象來訪問內(nèi)部類的屬性
Inner in = new Inner();
String str = in.name;
class Inner{
private String name = "in";
public void show(){
//訪問外部類的name
System.out.println(OutterClass.this.name);
}
}
}
同理也不能直接創(chuàng)建一個內(nèi)部類的對象混蔼,必須通過外部類的對象來創(chuàng)建履腋,因為內(nèi)部類的存在是以外部類為基礎(chǔ)的。
public static void main(String[] args) {
//通過外部類的對象來創(chuàng)建內(nèi)部類的對象
OutterClass out = new OutterClass("hi");
OutterClass.Inner in = out.new Inner();
}
方法內(nèi)部類
也很好理解惭嚣,就是在一個方法中定義了一個類:
public class OutterClass {
private String name = "out";
public void test(){
//內(nèi)部類
class Inner{
String name = "inner";
}
}
}
可以把Inner
理解為方法test
中的一個屬性遵湖,所以只能在這個方法中訪問,不能加訪問修飾符
匿名內(nèi)部類
匿名內(nèi)部類是沒有名字的類晚吞,所以沒有辦法引用它延旧,因此它只能使用一次,匿名內(nèi)部類通常用接口來實現(xiàn)槽地,在new
了之后就直接跟上類的body{}:
public class OutterClass implements TestInterface {
//匿名內(nèi)部類
TestInterface ti = new TestInterface() {
public void show(){
System.out.println("我是匿名內(nèi)部類中的方法");
}
};
}
匿名內(nèi)部類更好的體現(xiàn)了Java的封裝性迁沫,同時也使代碼變得更加簡潔,易讀捌蚊。匿名內(nèi)部類在Android中使用非常普遍集畅,基本上到處都能用到。
靜態(tài)內(nèi)部類
靜態(tài)內(nèi)部類跟類中類一樣缅糟,只不過在前面加了一個static
挺智,所以創(chuàng)建一個靜態(tài)內(nèi)部類不需要依賴外部類,也就是說即使沒有外部類的對象也可以直接new
一個靜態(tài)內(nèi)部類的對象溺拱。因為你new
一個靜態(tài)內(nèi)部類的時候可能還沒有外部類的對象逃贝,所以靜態(tài)內(nèi)部類是不能訪問外部類的非靜態(tài)的屬性和方法
public class OutterClass {
static int id = 1;
static void show(){
System.out.println("外部類的static方法");
}
static class Inner{
//訪問外部類的靜態(tài)屬性
int id = OutterClass.id;
//訪問外部類的靜態(tài)方法
void show(){
OutterClass.show();
}
}
}