成員內(nèi)部類
成員內(nèi)部類不能含有static的變量和方法浓体。因為成員內(nèi)部類需要先創(chuàng)建了外部類,才能創(chuàng)建它自己的;在成員內(nèi)部類要引用外部類對象時创橄,使用outer.this來表示外部類對象弟翘; 而需要創(chuàng)建內(nèi)部類對象虫腋,可以使用outer.inner obj = outerobj.new inner();一般情況下,不要將內(nèi)部類的訪問權(quán)限設(shè)置為public,除非真的存在外部類之外的合理引用:
Public class Outer{
Private int age = 10;
Private calss Inner{
Private int age =20;
Public void changeAge(){
age = 30;
局部類
Public class Outer{
Private int a =10;
Public print(int c){
Class Inner{
Private int b =20;
Public void print(){
syso("a:"+a);//10
syso("b:"+b);//20
syso("c:"+c);//30
}
}
New Inner().print();
}
}
局部類中不能使用this,super等關(guān)鍵字稀余。
局部類不得聲明訪問權(quán)限悦冀。
局部類不能喝外部類名稱相同。
局部內(nèi)部類也像別的類一樣進(jìn)行編譯睛琳,但只是作用域不同而已盒蟆,只在該方法或條件的作用域內(nèi)才能使用,退出這些作用域后無法引用的师骗。
靜態(tài)內(nèi)部類
靜態(tài)內(nèi)部類不能引用外部類中的非靜態(tài)成員历等,要引用外部的非靜態(tài)成員,就要先指向外部類的對象辟癌。
創(chuàng)建內(nèi)部類對象:
OuterClass.StaticInnerClass inter = new OuterClass.StaticInnerClass();
實際上使靜態(tài)內(nèi)部類成為了一個頂級類寒屯。
Static class只能用于內(nèi)部類,不能使用在外部類上黍少。
在以下場合可以使用靜態(tài)內(nèi)部類:
(1) 外部類需要使用內(nèi)部類寡夹,而內(nèi)部類無需使用外部類的資源
(2) 內(nèi)部類可以獨立外部類創(chuàng)建對象
public class Person{
//姓名
private String name;
//家庭
private Home home;
//構(gòu)造函數(shù)設(shè)置屬性值
public Person(String _name){
name = _name;
}
/* home、name的getter/setter方法省略 */
public static class Home{
//家庭地址
private String address;
//家庭電話
private String tel;
public Home(String _address,String _tel){
address = _address;
tel = _tel;
}
/* address厂置、tel的getter/setter方法省略 */
}
}
public static void main(String[] args) {
Home home = new Person.Home("上海", "021");
Person p1 = new Person("張三");
Person p2 = new Person("李四");
p1.setHome(home);
p2.setHome(home);
}
這里創(chuàng)建一個home對象菩掏,p1和p2都使用這個home對象,p1和p2共享同一個home對象,并且獨立于p1昵济、p2智绸;如果使用成員內(nèi)部類:
public static void main(String[] args) {
Person p1 = new Person("張三");
Home home = p1.new Home("上海", "021");
p1.setHome(home);
Person p2 = new Person("李四");
p2.setHome(home);
}
這里p1和p2依然共享同一個home對象,但此時home對象和p1是同生共死的砸紊,如果p1對象消亡传于,那么p2就沒有
家了,這對p2來說實在不公平醉顽,而如果為p1和p2都創(chuàng)建一個Home對象沼溜,又浪費資源。所以在這個例子中游添,
使用靜態(tài)內(nèi)部類比普通內(nèi)部類要合適系草。
匿名類
常用于匿名實現(xiàn)類:
new Thred(new Runable(){
run(){}
}).start();
使用嵌套類的好處
1通熄、 相關(guān)類的邏輯分組
2、 進(jìn)一步封裝private屬性找都,使得該屬性只能被內(nèi)部類訪問
3唇辨、 更好的閱讀性和維護(hù)性