Java內部類{[普通內部類][靜態內部類]}

 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 }
相關文章
相關標籤/搜索