內部類和外部類之間的相互調用


內部類:

①靜態內部類中可以有非靜態的方法

②當內部類中有靜態方法或者靜態成員變量時,一定是靜態內部類

 

一般內部類在外部類的成員變量位置,像這樣:

1 public class Outer {
2     class Inner{
3         
4     }
5 }

1、外部類訪問內部類:

   內部類被static修飾:可以直接new

    Inner in = new Inner();

   內部類沒有被static修飾:得先new出來外部類的實例,再new內部類的

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

2、內部類訪問外部類:(外部類.this.變量)

 

復制代碼
 1 public class Outer {
 2     int x = 9;
 3     class Inner{
 4         int x = 8;
 5         public void test(){
 6             int x = 7;
 7             System.out.println(x);
 8             System.out.println(this.x);
 9             System.out.println(Outer.this.x);
10             test1();
11         }
12     }
13     
14     private void test1(){
15         System.out.println("test");
16     }
17     public static void main(String[] args) {
18         Inner in = new Outer().new Inner();
19         in.test();
20     }
21 }
復制代碼

 

 

 

輸出為:7,8,9,test

分析:第七行第八行相信大家都沒有什么問題,第九行輸出的是9,說明訪問到了外部類的變量,而輸出的test說明內部類訪問到了外部類的test1方法

總結:

  輸出是9的原因:因為內部類持有一個外部類的引用,格式:外部類名.this

  可以調用private方法原因是:因為他們在一個類Outer中所以可以調用

3、外部類和內部類中的方法相互訪問:

①外部類的靜態方法test和非靜態內部類的非靜態方法voice的相互訪問:

   !  test----->voice       先new外類再new內類,再調方法

復制代碼
 1 public class Outerclass {
 2     class Inner{
 3         public void voice(){
 4             System.out.println("voice()");
 5         }
 6     }
 7     public static void test(){
 8         new Outerclass().new Inner().voice();
 9     }
10     public static void main(String[] args) {
      //主函數調用test方法
11 test();13 } 14 }
復制代碼

輸出:voice();

 
        

   !!  voice----->test        外類.this.方法(持有的外部類的引用)

復制代碼
 1 public class Outerclass {
 2     class Inner{
 3         public void voice(){
 4             Outerclass.this.test();
 5         }
 6     }
 7     public static void test(){
 8         System.out.println("test()");
 9     }
10     public static void main(String[] args) {
    //主函數調用voice()
11 Inner in = new Outerclass().new Inner(); 12 in.voice(); 13 } 14 }
復制代碼

 輸出:test();

  ②外部類的非靜態方法test和靜態內部類中的非靜態方法voice之間的相互調用

 ! voice------>test

復制代碼
 1 public class Outerclass {
 2     static class Inner{
 3         public void voice(){
 4             new Outerclass().test();
 5         }
 6     }
 7     public void test(){
 8         System.out.println("test()");
 9     }
10     public static void main(String[] args) {
    //主函數調用voice()方法
11 new Outerclass.Inner().voice(); 12 } 13 }
復制代碼

輸出:test();

!!  test----->voice

復制代碼
 1 public class Outerclass {
 2     static class Inner{
 3         public void voice(){
 4             System.out.println("voice()");
 5         }
 6     }
 7     public void test(){
      //1、其他類訪問外部類中的靜態內部類的非靜態方法
8 // new Outerclass.Inner().voice();
      //2、此處的Outerclass中的test方法訪問靜態內部類中的非靜態方法
       new Inner().voice();
9 } 10 public static void main(String[] args) {
      //主函數調用test方法
11 new Outerclass().test(); 12 } 13 }
復制代碼

輸出:voice();

 

4、總結:

外部類訪問內部類:必須建立內部類的對象

內部類訪問外部類:內部類可以直接訪問外部類的成員包括私有成員,因為外部類持有內部類的引用

 

特例:內部類寫在外部類的方法中(即局部變量的位置)

  1、內部來外部類均可定義變量/常量

  2、只能被final/abstract修飾

  3、只能訪問被final/abstract修飾的變量

  4、可以直接訪問外部類中的成員,因為還持有外部類的引用

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM