1. 程式人生 > >內部類(一)

內部類(一)

1.把一個類放在另一個類的內部定義,定義在其他類內部的類被稱為內部類,包含內部類的類被稱為外部類。內部類的主要作用有:

1)內部類提供了更好的封裝。

2)內部類可以直接訪問外部類的私有資料,因為內部類被當作是外部類的成員,外部類也可以訪問內部類的私有資料  點選開啟連結

內部類除了需要定義在其他類裡面之外,還有:

1)內部類比外部類可以多使用三個修飾符:private 、protected、static

2)非靜態內部類不能有靜態內部成員

3)內部類可以看作是一個類成員,所以可以用private,protected,public修飾。

  1. public class cow{
  2. private int age;
  3. public
    cow(int age)
    {
  4. this.age = age;
  5. }
  6. private class cowleg{
  7. private String color;
  8. private double length;
  9. private cowleg(String color,double length){
  10. this.color = color;
  11. this.length= length;
  12. }
  13. public void info(){
  14. System.out.println("年齡為"+age); //內部類可以訪問外部類的私有成員
  15. System.out.println("顏色為"+color+"長度為"
    +length);
  16. }
  17. }
  18. public void into(){
  19. cowleg one = new cowleg("白色",0.99);//為什麼這個構造cowleg物件不能放在main中實現呢?
  20. one.info();//因為內部類cowleg可以看作是一個cow的非靜態成員,那麼它構造器也可以看作cow的非靜態成員,不能單獨呼叫,必須使用cow的物件去呼叫。
  21. }
  22. public static void main(String[] args){
  23. cow hua = new cow(4);
  24. hua.into(); //使用cow物件hua去呼叫方法into,通過into去呼叫cowleg的構造器
  25. }
  26. }

如果想把cowleg構造器放在mian方法實現,可以有
  1. public class cow{
  2. private int age;
  3. public cow(int age){
  4. this.age = age;
  5. }
  6. private class cowleg{
  7. private String color;
  8. private double length;
  9. private cowleg(String color,double length){
  10. this.color = color;
  11. this.length= length;
  12. }
  13. public void info(){
  14. System.out.println("年齡為"+age); //內部類可以訪問外部類的私有成員
  15. System.out.println("顏色為"+color+"長度為"+length);
  16. }
  17. }
  18. public static void main(String[] args){
  19. cow hua = new cow(5);
  20. cowleg one = hua.new cowleg("白色",0.99); //使用cow物件去呼叫cowleg的構造器
  21. one.info();
  22. }
  23. }

注:cowleg類可以直接訪問cow類的private例項變數是因為非靜態內部類物件裡,儲存了一個它所寄生的外部類物件的引用(當呼叫非靜態內部類的例項方法時,必須有一個非靜態內部類例項,非靜態內部類例項必須寄生在外部類例項中。

2.當非靜態內部類的方法訪問某個變數時,系統優先在該方法裡查詢是否存在該名字的區域性變數。如果沒有,查詢該內部類裡是否有該名字的成員變數。如果沒有,則在外部類

裡找是否有同名字的成員變數。如果再沒有,則編譯器報錯

外部類成員變數,內部類成員變數與內部類裡方法的區域性變數同名時,可以使用this、外部類名.this作為限定來區分

  1. public class test25{
  2. private int one = 5;
  3. class zilei{
  4. private int one = 8;
  5. public void info(){
  6. int one = 10;
  7. System.out.println(test25.this.one);
  8. System.out.println(this.one);
  9. System.out.println(one);
  10. }
  11. }
  12. public static void main(String[] args){
  13. test25 first = new test25();
  14. zilei second = first.new zilei();
  15. second.info();
  16. }
  17. }

3.非靜態內部類不能有靜態方法,靜態成員變數和靜態初始化塊。 

4.靜態內部類。   注:static不能修飾外部類,只能修飾內部類

根據靜態成員不能訪問非靜態成員的規則,靜態內部類不能訪問外部類的例項成員。即使是靜態內部類的例項方法也不能訪問外部類的例項成員,只能訪問外部類的靜態成員

(靜態內部類可以看做是外部類的靜態成員,所以在外部類載入的時候就裝進記憶體了,而這時外部類例項還沒建立。)

5.java還允許在接口裡定義內部類,接口裡定義的內部類預設使用public static修飾(因為介面沒有物件,內部類要麼寄生在外部類的物件中,要麼隨外部類載入一起建立。),也就是說,介面內部類只能是靜態內部類