內部類:
①靜態內部類中可以有非靜態的方法
②當內部類中有靜態方法或者靜態成員變量時,一定是靜態內部類
一般內部類在外部類的成員變量位置,像這樣:
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、可以直接訪問外部類中的成員,因為還持有外部類的引用