Posted on 2013-09-28 14:26
hoshelly 閱讀(255)
評論(0) 編輯 收藏 引用 所屬分類:
Java
什么是內部類呢?顧名思義,內部類就是在類中可以定義另一個的類。內部類是外部對象的一個成員,同樣具有public , private 和 protected的訪問權限。
public class Test
{
public static void main(String[] args)
{
Family my = new Family(“Jonh",130);
my.getMsg();
}
}
class Family
{
Family(String name,int weight){ this.f = new Father(name,weight); }
private class Father
{
private int weight;
private String name;
Father(String n,int w)
{
this.name = n;
this.weight = w;
}
public int getWeight()
{
return weight;
}
public String getName()
{
return name;
}
}
private Father f;
public void getMsg()
{
System.out.println("Name: "+f.getName()+"\nWeight: "+f.getWeight());
}
}
類Family 中有一個Father類,聲明為private,表明在Family類中可以創建一個實例對象,這個Father專屬于Family類。普通的(非內部)類不能聲明為private或者protected,只能聲明為public。因此這樣的代碼是不被允許的:
Family.Father a = my.new Father("Jonh",150);
如果要使用上述代碼,只要修改內部類的訪問權限就可以了,如去掉private權限,則默認為包訪問權限,同一個包中的類都可以訪問它,而不是只能從Family類才能訪問。
public class test
{
public static void main(String[] args)
{
Family my = new Family("Jonh",130);
my.getMsg();
Family.Father a = my.new Father("Jonh",150);
System.out.println("Name: "+a.getName()+"\nWeight: "+a.getWeight());
}
}
在上述代碼中,在創建內部類對象時,語法為:Family.Father a = my.new Father("Jonh",150); 說明內部類對象的創建是基于一個外部類對象(my),也就是說內部類對象必須依附于一個外部類對象。
內部類可以出現在所屬類的方法內或任意作用域內。像下面的代碼將內部類嵌入在方法內:
public class test
{
public static void main(String[] args)
{
Family my = new Family();
my.getMsg("Jonh",150);
}
}
class Family
{
Family(){ }
public void getMsg(String s,int n)
{
class Father
{
private int weight;
private String name;
Father(String n,int w)
{
this.name = n;
this.weight = w;
}
public int getWeight()
{
return weight;
}
public String getName()
{
return name;
}
}
Father f = new Father(s,n);
System.out.println("Name: "+f.getName()+"\nWeight: "+f.getWeight());
}
}
閉包
內部類可以訪問外部類的成員變量(即使是private),如在Family類中添加成員變量height,在Father類中定義一個方法 getHeight(),則能成功訪問這個height變量,而在外部類中不能訪問內部類中的成員變量。
class Family
{
private int height = 180;
/*定義外部類屬性height*/ Family(String name,
int weight){
this.f =
new Father(name,weight); }
private class Father
{
private int weight;
private String name;
Father(String n,
int w)
{
this.name = n;
this.weight = w;
}
public int getWeight()
{
return weight;
}
public String getName()
{
return name;
}
public int getHeight()
{
return height;
/*訪問外部類的屬性height*/ }
}
private Father f;
public void getMsg()
{
System.out.println("Name: "+f.getName()+"\nWeight: "+f.getWeight()+"\nHeight: "+f.getHeight());
}
}
public class test
{
public static void main(String[] args)
{
Family my =
new Family("Jonh",130);
my.getMsg();
/* not allowed */ /* System.out.println(my.weight); */
}
}
如果把內部類單獨拿到外面來聲明,那么要使用外部類的屬性如height,就要先創建外部類的對象,再由對象調用其height屬性,現在由于內部類處于外部類中,所以在程序調用時不必再創建外部類的對象,直接就可以使用height,這樣減少了一部分內存空間的開銷。
嵌套static類在類內部定義static類,稱為嵌套static類。
我們可以直接創建嵌套類,而不必依賴于某個外部類對象。嵌套類無法調用外部對象的方法、也無法讀取或修改外部對象的數據。
如:
public class Test{
public static void main(String[] args){
Father.Son John = new Father.Son();
John.display();
}
}
class Father{
/*嵌套類*/
static class Son{
public void display(){
System.out.println("I am his son.");
}
}
}
總結1. 內部類豐富了類的組織形式;
2. 內部類實現了閉包。