1 package Learn.com.seven; 2 /** 3 * 4 * @author tqw 5 * 本例主要學習內部類的使用 6 * Java的內部類分紅兩部分來說: 7 * 1:內部類 8 * 2:靜態內部類 9 * 10 */ 11 public class ParcellA {//外部類 12 13 private int pMember;//聲明一個私有成員 14 private static int pstMember;//聲明一個私有靜態成員 15 private final int pfMember=9;//常量值 16 private final static int pfsMember=0;//常量靜態成員 17 18 /** 19 * 20 * @author tqw 21 * -# 普通內部類能夠訪問外部類的全部成員和方法, 22 * -# 如何在其餘的類訪問此內部類呢 23 * -# 必須使用外部類的對象來建立內部類對象 24 * -# ParcellA parcel = new ParcellA(); 見Entry.java 25 * ParcellA.Contents content = parcel.new Contents(); 26 */ 27 public class Contents{//嵌套定義一個內部類 28 private int i = 11; 29 30 public int value(){//給內部類,定義的一個方法 31 System.out.println(pMember);//全部成員 32 System.out.println(pstMember); 33 System.out.println(pfMember); 34 System.out.println(pfsMember); 35 outClassMethod();//能夠訪問外部類的普通方法 36 outClassStaticMehtod();//及靜態方法 37 return i; 38 } 39 /** 40 * @see 可是若Contesnts是靜態的,則能夠聲明靜態成員和靜態方法 41 */ 42 // private static int j=0;//非靜態內部類,不能聲明[靜態成員] 43 // private static int out(){//非靜態內部類,不能聲明[靜態方法] 44 // } 45 46 } 47 /** 48 * 49 * @author tqw 50 * - 定義一個嵌套內部類 51 * -# 不能訪問外部內的【非靜態成員】,只能訪問外部類的【靜態成員】。同理也不能訪問外部類的非靜態方法 52 * -# 53 */ 54 public static class InnerStaticClass{ 55 private static int memberOfStatic;//能夠定義靜態成員 56 private static int Out(){//能夠定義靜態方法 57 //outClassMethod();//不能訪問外部類的非靜態方法 58 //System.out.println(pMember);//因爲ParcellA,是靜態內部類,因此不能訪問外部內的非靜態成員 59 //由於靜態類,是在加載類時,就初始化了。而非靜態成員,是在建立對象時才初始化,分配內存 60 //所以,在靜態類初始化時訪問外部類的非靜態成員時,非靜態成員還不存在,因此不能訪問 61 System.out.println(pstMember);//能夠訪問靜態成員 62 System.out.println(pfsMember);//能夠訪問常量成員.因爲final int是不可變的成員,即在程序運行中它的值不能夠修改。所以 63 //final成員的值,就能夠在加載類時就肯定下來。因此在靜態內部類訪問它時,它是已知的,因此就 64 //能夠訪問 65 System.out.println(pfsMember);//同上緣由,因此能夠訪問 66 outClassStaticMehtod();//能夠訪問靜態方法 67 return memberOfStatic; 68 } 69 70 public void Myout(){ 71 Out(); 72 } 73 } 74 /** 75 * 76 * @author tqw 77 * 78 */ 79 class Destination{//定義另外一個內部類,注意默認訪問權限爲包訪問權限,不能在另外一個包訪問 80 private String label; 81 Destination(String WhereTo){//內部類的構造方法 82 label =WhereTo; 83 } 84 String ReadLabel(){//給內部類,定義的一個方法 85 return label; 86 } 87 } 88 89 90 public void outClassMethod(){ 91 System.out.println("outClass Non_Static Method"); 92 } 93 public static void outClassStaticMehtod(){ 94 System.out.println("outClass Static Method"); 95 } 96 }
1 package Learn.com.test; 2 3 import Learn.com.seven.ParcellA; 4 5 public class Entry { 6 7 /** 8 * @param args 9 */ 10 public static void main(String[] args) { 11 ParcellA parcel = new ParcellA(); 12 //因爲Contests這個內部類,是public權限,因此能夠訪問, 13 //但注意必須是用外部類ParcellA的對象來parcel.new 來建立內部類的對象. 14 //而且聲明內部類的對象時,須要使用ParcellA.Contents 這種"外部類.內部類"的方式 15 16 ParcellA.Contents content = parcel.new Contents(); 17 content.value(); 18 19 20 //因爲Destination,是包訪問權限,因此下面的訪問錯誤 21 //ParcellA.Destination desten = parcel.new Destination("china"); 22 23 //注意,因爲InnerStaticClass是ParcellA的靜態內部類,因此能夠直接用它來建立對象 24 //對於這種用法,在android中的佈局中用到,好比 25 //LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT); 26 //LinearLayout.LayoutParams 類就是LinearLayout中的靜態內部類,能夠經過android的LinearLayout.java源碼查看 27 ParcellA.InnerStaticClass obj = new ParcellA.InnerStaticClass(); 28 obj.Myout();//能夠調用public方法 ,只能訪問本身的方法,在這裏不能直接訪問外部類的方法,外部方法對它不可見 29 } 30 31 }