java學習筆記18——內部類

  外部類的上一級程序單元是包,所以它只有2個作用域:同一個包內和任何位置。因此只需要2種訪問權限:包訪問權限和公開訪問權限,正好對應省略訪問控制符和public訪問控制符。省略訪問控制符是包訪問權限,即同一包中的其他類可以訪問省略訪問控制符的成員。如果一個外部類不適用任何控制符修飾,則只能被同一個包中其他類訪問。而內部類的上一級程序單元是外部類,它有4個作用域:同一個類、同一個包、父子類和任何位置。
例        
public class Cow{
private double weight;
public Cow(){};
public Cow(double weight){
this.weight = weight;
}
private class CowLeg{
private double length;
private String color;
public CowLeg(){};
public CowLeg(double length , String color){
this.length = length ;
this.color = color;
}
public void setLength(double length){
this.length = length ;
}
public double getLength(){
return this.length;
}
public void setColor(String color){
this.color = color;
}
public String getColor(){
return this.color;
}
public void info(){
System.out.println("當前牛腿顏色是:"+color+",高:"+length);
System.out.println("本牛腿所在奶牛重:"+weight);
}
}
public void test(){
CowLeg c1 = new CowLeg( 1.12 "黑白相間");
c1.info();
}
public static void main(String[] args){
Cow cow = new Cow(378.9);
cow.test();
}
}

        非靜態內部類的成員可以訪問外部類的private成員,但反過來就不成立。非靜態內部類的成員只在非靜態內部類範圍內是可知的,不併能被外部類直接使用。如果外部類需要訪問非靜態內部類的成員,則必須顯示創建非靜態內部類對象來調用訪問其實例成員
public class Outer{
private int outProp = 9;
class Inner{
private int inProp = 5;
public void accessOuterProp(){
System.out.println("外部類的outPut值:"+outProp);
}
}
public void accessInnerProp{
System.out.println("內部類的inProp值:"new Inner().inProp);
}
public static void main(String[] args){
Outer out = new Outer();
out.accessInnerProp();
}
}

        非靜態內部類對象必須寄存在外部類對象裏,而外部類對象則不必一定有非靜態內部類對象寄存其中。如果存在一個非靜態內部類對象,則一定存在一個被它寄存的外部類對象。靜態成員不能訪問非靜態成員。 
        外部類的靜態方法、靜態代碼塊不能訪問非靜態內部類,包括不能使用非靜態內部類定義變量、創建實例等。總之,不允許在外部類的靜態成員中直接使用非靜態內部類。
        也就是main函數裏不能創建非靜態內部類實例。
public class StaticTest{
private class In{}
public static void main(String[] args){
// new In();  錯誤,靜態成員不能訪問非靜態成員。
}
        注意,非靜態內部類裏不能定義靜態成員,即靜態方法、靜態成員變量、靜態初始化塊。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章