我們所說的內部類,官方的叫法是巢狀類(nested classes)。巢狀類包括靜態內部類(static nested classes)和內部類(inner classes)。而內部類分為成員內部類,區域性內部類(local classes)和匿名內部類(anonymous classes)。
內部類是乙個編譯時的概念,一旦編譯成功,就會成為完全不同的兩個類,分別為outer.class和outer$inner.class類。所以內部類的成員變數/方法名可以和外部類的相同。
當你訪問外部類的私有資料成員時,jdk會在外部類中建立包級訪問許可權的(package-acess)成員函式以便內部類來訪問外部類的私有成員。這種結果會導致乙個安全漏洞。通常情況下,我們應當盡量避免使用內部類。
只有當內部類僅僅只和外部類的上下文相關或者內部類需要被設定為私有的且只能被外部類訪問的這些情況下,我們才使用內部類。內部類主要被用來實現類似iterators、comparators這些輔助類。它們被使用在外部類的上下文中。
內部類是指在乙個外部類的內部再定義乙個類,內部類作為外部類的乙個成員並且依附於外部類而存在的。
注意這裡明確說明了是在類的內部作為其成員,而不僅僅只是和外部類在同乙個class檔案中!
如下所示:列舉類operator和oo均為searchfilter的內部類
如下所示,class bb 和class searchfilter在同乙個class 檔案中,但是二者並無關係。唯一需要注意的是,乙個class檔案只能有乙個public型別的外部類!
編譯後的class檔案顯示如下:
可以在乙個外部類中定義多個內部類,這些內部類在邏輯上是乙個整體,與外部類之間是從屬關係。在內部類中可以訪問外部類定義的私有成員。
其特點如下:
內部類示例**如下:
public class outer
} //方法定義
public void testinner()
}
在上述**中,在outer類中定義了屬性size、內部類inner和方法testinner(),在方法中呼叫內部類,直接通過"物件.方法"的形式即可呼叫。
如果在其他類中需要呼叫inner類中的方法,則可以使用以下格式:
//方法一
outer.inner in = new outer().new inner();
in.dostuff();
//方法二
outer o = new outer();
outer.inner in = o.new inner();
in.dostuff();
內部類可以通過static修飾,稱為靜態內部類,在靜態內部類中呼叫外部類成員,外部類成員也要求用static修飾。
如果內部類用static修飾,則可以使用以下格式呼叫其方法。
outer.inner in = new outer.inner();
in.dostuff();
當外部類和內部類成員變數相同時,在內部類中需要使用「外部類.this.attr」來呼叫外部類的變數。示例如下:
public class a }}
輸出結果:10 100
二者區別示例如下:
public class testinnerclass
}class person
public void setname(string name)
public void info()
} //成員內部類(靜態內部類)
static class dog
/*成員方法*/
public void show()
public void method1()
}}
執行結果:
我是show()方法
杜鵑黃鸝
韓梅梅
示例如下:
public class testinnerclass1
class outerclass
} //常常使用乙個方法,使其返回值為某個類或介面的物件。
//而這個類或介面在方法內部建立
//使用方式一
public comparable getcomparable()
} }//使用方式二
public comparable getcomparable1()
};/*
new thread(new runnable() }}
});*/
}}
為什麼匿名內部類和區域性內部類只能訪問final變數?
參考博文:**匿名內部類和區域性內部類只能訪問final變數
非靜態巢狀類(即內部類)對它巢狀的外部類的成員擁有全部的訪問許可權。
而靜態巢狀類並不包含對外部類的例項引用,這就使得靜態巢狀類不能夠呼叫外部類例項的非靜態方法或者訪問外部類的非靜態字段。
在宣告成員欄位和方法上,非靜態巢狀類不能夠定義靜態欄位和方法。但是,靜態內部類則可以定義靜態欄位和方法也可以定義非靜態欄位和方法。
非靜態內部類的例項是通過使用外部類的物件引用來建立的,也就在說在內部類中已經定義了外部類例項。但是靜態巢狀類例項的建立過程中並不涉及到外部類的引用,這就是說它並不擁有外部類的例項。
示例如下:
public class outerclass
static class staticinnerclass
}class test
}
內部類(靜態 成員 區域性 匿名)
靜態內部類 可以用訪問控制許可權的修飾符修飾 可以等同看做靜態變數 可以訪問外部類中私有的資料 作用 靜態內部類可以直接訪問外部類的靜態資料,無法直接訪問成員 public class demo18 private void m2 static class innerclass public voi...
成員內部類,區域性內部類,靜態內部類,匿名內部類
成員內部類 class demo1 innerclass a 內部類概述 b 內部類訪問特點 a 內部類可以直接訪問外部類的成員,包括私有。b 外部類要訪問內部類的成員,必須建立物件。外部類名.內部類名 物件名 外部類物件.內部類物件 class outer class demo2 innercla...
靜態內部類,成員內部類,區域性內部類,匿名內部類
一 靜態內部類 它是用static修飾的,在訪問限制上它只能訪問外部類中的static所修飾的成員變數或者是方法 演示 public class test 01 public static void main string args 二 成員內部類 成員內部類是最普通的內部類,它可以無條件訪問外部類...