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 }

 


免責聲明!

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



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