<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    新的起點 新的開始

    快樂生活 !

    內部類導論

    平時在用內部類 也通常就是匿名類 在SWING 中的事件處理。今天查了查內部類 總結一下:

    一、什么是嵌套類及內部類?
        可以在一個類的內部定義另一個類,這種類稱為嵌套類(nested classes),它有兩種類型:
    靜態嵌套類和非靜態嵌套類。靜態嵌套類使用很少,最重要的是非靜態嵌套類,也即是被稱作為
    內部類(inner)。嵌套類從JDK1.1開始引入。其中inner類又可分為三種:
        其一、在一個類(外部類)中直接定義的內部類;
        其二、在一個方法(外部類的方法)中定義的內部類;
        其三、匿名內部類。
    下面,我將說明這幾種嵌套類的使用及注意事項。
    二、靜態嵌套類
        如下所示代碼為定義一個靜態嵌套類,

    public class StaticTest {
    private static String name = "javaJohn";
    private String id = "X001";

    static class Person{
    private String address = "swjtu,chenDu,China";
    public String mail = "josserchai@yahoo.com";//內部類公有成員
    public void display(){
    //System.out.println(id);//不能直接訪問外部類的非靜態成員
    System.out.println(name);//只能直接訪問外部類的靜態成員
    System.out.println("Inner "+address);//訪問本內部類成員。
    }
    }

    public void printInfo(){
    Person person = new Person();
    person.display();

    //System.out.println(mail);//不可訪問
    //System.out.println(address);//不可訪問

    System.out.println(person.address);//可以訪問內部類的私有成員
    System.out.println(person.mail);//可以訪問內部類的公有成員

    }
    public static void main(String[] args) {
    StaticTest staticTest = new StaticTest();
    staticTest.printInfo();
    }
    }
    在靜態嵌套類內部,不能訪問外部類的非靜態成員,這是由Java語法中"靜態方法不能直接訪問非靜態成員"所限定。
    若想訪問外部類的變量,必須通過其它方法解決,由于這個原因,靜態嵌套類使用很少。注意,外部類訪問內
    部類的的成員有些特別,不能直接訪問,但可以通過內部類來訪問,這是因為靜態嵌套內的所有成員和方法默認為
    靜態的了。同時注意,內部靜態類Person只在類StaticTest 范圍內可見,若在其它類中引用或初始化,均是錯誤的。
    三、在外部類中定義內部類
        如下所示代碼為在外部類中定義兩個內部類及它們的調用關系:

    public class Outer{
    int outer_x = 100;

    class Inner{
    public int y = 10;
    private int z = 9;
    int m = 5;
    public void display(){
    System.out.println("display outer_x:"+ outer_x);
    }
    private void display2(){
    System.out.println("display outer_x:"+ outer_x);
    }

    }

    void test(){
    Inner inner = new Inner();
    inner.display();
    inner.display2();
    //System.out.println("Inner y:" + y);//不能訪問內部內變量
    System.out.println("Inner y:" + inner.y);//可以訪問
    System.out.println("Inner z:" + inner.z);//可以訪問
    System.out.println("Inner m:" + inner.m);//可以訪問

    InnerTwo innerTwo = new InnerTwo();
    innerTwo.show();
    }

    class InnerTwo{
    Inner innerx = new Inner();
    public void show(){
    //System.out.println(y);//不可訪問Innter的y成員
    //System.out.println(Inner.y);//不可直接訪問Inner的任何成員和方法
    innerx.display();//可以訪問
    innerx.display2();//可以訪問
    System.out.println(innerx.y);//可以訪問
    System.out.println(innerx.z);//可以訪問
    System.out.println(innerx.m);//可以訪問
    }
    }

    public static void main(String args[]){
    Outer outer = new Outer();
    outer.test();
    }
    }
    以上代碼需要說明有,對于內部類,通常在定義類的class關鍵字前不加public 或 private等限制符,若加了
    沒有任何影響,同時好像這些限定符對內部類的變量和方法也沒有影響(?)。另外,就是要注意,內部類Inner及
    InnterTwo只在類Outer的作用域內是可知的,如果類Outer外的任何代碼嘗試初始化類Inner或使用它,編譯就不
    會通過。同時,內部類的變量成員只在內部內內部可見,若外部類或同層次的內部類需要訪問,需采用示例程序
    中的方法,不可直接訪問內部類的變量。

    四、在方法中定義內部類
        如下所示代碼為在方法內部定義一個內部類:

    public class FunOuter {
    int out_x = 100;

    public void test(){
    class Inner{
    String x = "x";
    void display(){
    System.out.println(out_x);
    }
    }
    Inner inner = new Inner();
    inner.display();
    }

    public void showStr(String str){
    //public String str1 = "test Inner";//不可定義,只允許final修飾
    //static String str4 = "static Str";//不可定義,只允許final修飾
    String str2 = "test Inner";
    final String str3 = "final Str";
    class InnerTwo{
    public void testPrint(){
    System.out.println(out_x);//可直接訪問外部類的變量
    //System.out.println(str);//不可訪問本方法內部的非final變量
    //System.out.println(str2);//不可訪問本方法內部的非final變量
    System.out.println(str3);//只可訪問本方法的final型變量成員
    }
    }
    InnerTwo innerTwo = new InnerTwo();
    innerTwo.testPrint();
    }

    public void use(){
    //Inner innerObj = new Inner();//此時Inner己不可見了。
    //System.out.println(Inner.x);//此時Inner己不可見了。
    }


    public static void main(String[] args) {
    FunOuter outer = new FunOuter();
    outer.test();
    }
    }

    從上面的例程我們可以看出定義在方法內部的內部類的可見性更小,它只在方法內部
    可見,在外部類(及外部類的其它方法中)中都不可見了。同時,它有一個特點,就是方法
    內的內部類連本方法的成員變量都不可訪問,它只能訪問本方法的final型成員。同時另一個
    需引起注意的是方法內部定義成員,只允許final修飾或不加修飾符,其它像static等均不可用。
    五、匿名內部類
        如下所示代碼為定義一個匿名內部類:匿名內部類通常用在Java的事件處理上


    import java.applet.*;
    import java.awt.event.*;

        public class AnonymousInnerClassDemo extends Applet{
        public void init(){
            addMouseListener(new MouseAdapter(){
                public void mousePressed(MouseEvent me){
                 showStatus("Mouse Pressed!");
            }
            })
        }
        public void showStatus(String str){
            System.out.println(str);
        }
        }

    在上面的例子中,方法addMouseListener接受一個對象型的參數表達式,于是,在參數里,我們定義了一個匿名內部類這個類是一個MouseAdapter類型的類,同時在這個類中定義了一個繼承的方法mousePressed,整個類做為一個參數。這個類沒有名稱,但是當執行這個表達式時它被自動實例化。同時因為,這個匿名內部類是定義在AnonymousInnerClassDemo 類內部的,所以它可以訪問它的方法showStatus。這同前面的內部類是一致的。
    六、內部類使用的其它的問題

    通過以上,我們可以清楚地看出內部類的一些使用方法,同時,在許多時候,內部類是在如Java的事件處理、或做為值對象來使用的。同時,我們需注意最后一個問題,那就是,內部類同其它類一樣被定義,同樣它也可以繼承外部其它包的類和實現外部其它地方的接口。同樣它也可以繼承同一層次的其它的內部類,甚至可以繼承外部類本身。下面我們給出最后一個例子做為結束:



    public class Layer {
    //Layer類的成員變量
    private String testStr = "testStr";

    //Person類,基類
    class Person{
    String name;
    Email email;
    public void setName(String nameStr){
    this.name = nameStr;
    }
    public String getName(){
    return this.name;
    }
    public void setEmail(Email emailObj){

    this.email = emailObj;
    }
    public String getEmail(){
    return this.email.getMailStr();
    }
    //內部類的內部類,多層內部類
    class Email{
    String mailID;
    String mailNetAddress;
    Email(String mailId,String mailNetAddress){
    this.mailID = mailId;
    this.mailNetAddress = mailNetAddress;
    }
    String getMailStr(){
    return this.mailID +"@"+this.mailNetAddress;
    }
    }
    }
    //另一個內部類繼承外部類本身
    class ChildLayer extends Layer{
    void print(){
    System.out.println(super.testStr);//訪問父類的成員變量
    }
    }
    //另個內部類繼承內部類Person
    class OfficePerson extends Person{
    void show(){
    System.out.println(name);
    System.out.println(getEmail());
    }
    }
    //外部類的測試方法
    public void testFunction(){
    //測試第一個內部類
    ChildLayer childLayer = new ChildLayer();
    childLayer.print();

    //測試第二個內部類
    OfficePerson officePerson = new OfficePerson();
    officePerson.setName("abner chai");
    //注意此處,必須用 對象.new 出來對象的子類對象
    //而不是Person.new Email(...)
    //也不是new Person.Email(...)
    officePerson.setEmail(officePerson.new Email("josserchai","yahoo.com"));

    officePerson.show();
    }
    public static void main(String[] args) {
    Layer layer = new Layer();
    layer.testFunction();
    }
    }


    posted on 2007-05-21 13:15 advincenting 閱讀(135) 評論(0)  編輯  收藏


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     

    公告

    Locations of visitors to this pageBlogJava
  • 首頁
  • 新隨筆
  • 聯系
  • 聚合
  • 管理
  • <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    統計

    常用鏈接

    留言簿(13)

    隨筆分類(71)

    隨筆檔案(179)

    文章檔案(13)

    新聞分類

    IT人的英語學習網站

    JAVA站點

    優秀個人博客鏈接

    官網學習站點

    生活工作站點

    最新隨筆

    搜索

    積分與排名

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 国产精品四虎在线观看免费| 114一级毛片免费| 国产精品国产午夜免费福利看 | 亚洲综合一区二区三区四区五区| 亚洲一区二区免费视频| 亚洲一区免费观看| 曰批全过程免费视频播放网站| 亚洲AV无码久久精品狠狠爱浪潮| 日本高清不卡aⅴ免费网站| 亚洲日韩乱码中文无码蜜桃臀网站 | 自拍偷自拍亚洲精品播放| 成人男女网18免费视频| 亚洲老熟女五十路老熟女bbw| 成人免费网站在线观看| 日韩欧美亚洲国产精品字幕久久久| 日韩免费观看视频| 九九九国产精品成人免费视频| 亚洲色爱图小说专区| 97视频免费观看2区| 亚洲一级黄色大片| 国产无遮挡裸体免费视频| 性生大片视频免费观看一级| 亚洲情综合五月天| 1000部拍拍拍18勿入免费视频软件 | 免费看无码自慰一区二区| 精品一区二区三区免费毛片| 亚洲精品动漫人成3d在线| 国产免费网站看v片在线| 久久99亚洲网美利坚合众国| 最近中文字幕mv手机免费高清| 国产成人+综合亚洲+天堂| 自拍偷自拍亚洲精品被多人伦好爽 | 99精品视频在线观看免费| 亚洲黄色在线观看网站| 免费看a级黄色片| 国产一级黄片儿免费看| 亚洲AV色吊丝无码| 亚洲国产精品激情在线观看| 亚洲免费视频网址| 免费国产黄网站在线观看动图| 亚洲国产精品福利片在线观看|