天天看點

内部類

概述: 就是把一個類定義在另一個類中,那麼這個類我們就将其稱之為内部類

按照位置進行分類

* 成員内部類 就是把這個類定義在了成員位置(類中方法外的位置)

*private: 提高資料的安全性

*static : 通路其他的類通路

*非靜态的成員内部類被其他類建立對象的格式: 外部類名.内部類名 對象名 = 外部類對象.内部類對象 ;

*靜态的成員内部類被其他類建立對象的格式: 外部類名.内部類名 對象名 = new 外部類名.内部類名() ;

* 局部内部類 就是把這個類定義在局部位置(方法定義中的位置)

特點

為什麼局部内部類在通路局部變量的時候,要求這個局部變量要被final修飾?
因為當調用這個方法時,局部變量如果沒有用final修飾,他的生命周期和方法的生命周期是一樣的,當方法彈棧,這個局部變量也會消失,那麼如果局部内部類對象還沒有馬上消失想用這個局部變量,就沒有了,如果用final修飾會在類加載的時候進入常量池,即使方法彈棧,常量池的常量還在,也可以繼續使用,但是jdk1.8取消了這個事情,是以我認為這是個bug

内部類的特點

* 内部類可以直接通路外部類的成員,包含私有的
public class aa {

  public static void main(String[] args) {

      // 外部類名.内部類名 對象名 = 外部類名.内部類對象;

    Outer.Inner oi = new Outer.Inner();

    oi.method();

    Outer.Inner2.print();

  }

}

//靜态的内部類

class Outer {

  static class Inner {

  public void method() {

    System.out.println("method");

  }

}

 

static class Inner2 {

  public static void print() {

    System.out.println("print");

  }

  }

}
      
public class aa {

public static void main(String[] args) {

  Outer.Inner oi = new Outer().new Inner();

  oi.show();

}

}

//成員内部類

// 要求:使用已知的變量,在控制台輸出30,20,10。

 

// 内部類之是以能擷取到外部類的成員,是因為他能擷取到外部類的引用外部類名.this

 

class Outer {

public int num = 10;

 

class Inner {

  public int num = 20;

 

  public void show() {

    int num = 30;

    System.out.println(num);

    System.out.println(this.num);

    System.out.println(Outer.this.num);

  }

  }

}
      
public class aa {

public static void main(String[] args) {

    // Outer.Inner oi = new Outer().new Inner();
  
    // oi.method();

    Outer o = new Outer();

    o.print();

  }

}

class Outer {

  private int num = 10;

 

  private class Inner {

    public void method() {

      System.out.println(num);

    }

  }

    public void print() {

      Inner i = new Inner();

      i.method();

    }

}
      
public class aa {

  public static void main(String[] args) {

    Outer o = new Outer();

    o.method();

  }

}

 

// 局部内部類

class Outer {

  public void method() {

    final int num = 10;

    class Inner {

      public void print() {
  
        System.out.println(num);

      }

    }
    Inner i = new Inner();

    i.print();

   }

/*

* public void run() { Inner i = new Inner(); //局部内部類,隻能在其所在的方法中通路

* i.print(); }

*/

}
      

繼續閱讀