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

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

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

    eric-1001c

      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      3 隨筆 :: 45 文章 :: 12 評論 :: 0 Trackbacks

    1)利用多態(tài)實現(xiàn)向上轉(zhuǎn)型upcase中的方法和域問題

    1. 一般的多態(tài)中的方法

     

    class Super {
        
    public void sayHello(){
            System.out.println(
    "Super.sayHello()");
        }

        
    public void display(){
            System.out.println(
    "Super.display()");
        }

    }

    class Sub extends Super {
        
    public void sayHello(){
            System.out.println(
    "Sub.sayHell0()");
        }

        
    public void display(){
            System.out.println(
    "Sub.display()");
        }

    }

    public class ExtendsTest {
        
    public static void main(String[] args) {
            System.out.println(
    "*****Super: Super*****");
            Super sup 
    = new Super();
            sup.sayHello();
            sup.display();
            
            System.out.println(
    "*****Sub:Sub*****");
            Sub sub 
    = new Sub();
            sub.sayHello();
            sub.display();
                    
            System.out.println(
    "*****Super:Sub*****");
            Super sup2 
    = new Sub();
            sup2.sayHello();
            sup2.display();
        }

    }

    //output
    *****Super: Super*****
    Super.sayHello()
    Super.display()
    *****Sub:Sub*****
    Sub.sayHell0()
    Sub.display()
    *****Super:Sub*****
    Sub.sayHell0()
    Sub.display()

    這是最簡單,最常見的多態(tài)的一種情形,方法是用public修飾的。導出類的方法覆蓋了基類的方法,當導出類向上轉(zhuǎn)型的后(sub-->super),sup2在加載類方法的時候,會檢查導出類是否有覆蓋該方法,如果有就調(diào)用導出類的方法,因此這里sup2.display(),sup2.sayHello()結(jié)果都是Sub的。在這種情況下最好是使用javase5的@Override注解.但如果基類的方法是private(也就是final),那又會出現(xiàn)什么情況呢?

    class Sub extends Super {
        @Override
        
    public void sayHello(){
            System.out.println(
    "Sub.sayHell0()");
        }

        @Override
        
    public void display(){
            System.out.println(
    "Sub.display()");
        }

    }

    public class Super {
        
    public void sayHello(){
            System.out.println(
    "Super.sayHello()");
        }

        
    public void display(){
            System.out.println(
    "Super.display()");
        }

        
    private void sayGoodbye(){
            System.out.println(
    "Super.sayGoodbye()");
        }

        
    public static void main(String[] args) {
            System.out.println(
    "*****Super: Super*****");
            Super sup 
    = new Super();
            sup.sayHello();
            sup.display();
            sup.sayGoodbye();
            
            System.out.println(
    "*****Sub:Sub*****");
            Sub sub 
    = new Sub();
            sub.sayHello();
            sub.display();
    //        sub.sayGoodbye();   sub class cann't invoke the private method of superclass 
                    
            System.out.println(
    "*****Super:Sub*****");
            Super sup2 
    = new Sub();
            sup2.sayHello();
            sup2.display();
                // inoke the mothd of super class
            sup2.sayGoodbye();
        }

    }

    在這個例子中,主要是想體現(xiàn)出如果基類的方法是private的,導出類就不能繼承這個方法。在向上轉(zhuǎn)型中調(diào)用這個方法,能且僅能調(diào)用基類的private方法(當然要求main()在基類中調(diào)用,否則在基類以外的地方不能調(diào)用基類的private方法,這個列子正是如此)
    下面再看如果方法是static的呢

    class StaticSuper{
        
    public static void staticGet(){
            System.out.println(
    "staticsuper.staticGet()");
        }

        
    public void dynamicGet(){
            System.out.println(
    "staticsuper.dynamicGet()");
        }

    }

    class StaticSub extends StaticSuper{
        
    public static void staticGet(){
            System.out.println(
    "staticsub.staticGet()");
        }

        
    public void dynamicGet(){
            System.out.println(
    "staticsub.dynamicGet()");
        }

    }

    public class StaticPolymorphism {
        
    public static void main(String[] args) {
            StaticSuper sup 
    = new StaticSub();
            sup.staticGet();
            sup.dynamicGet();
        }


    }

    //output
    staticsuper.staticGet()
    staticsub.dynamicGet()

    由這個例子可以知道在多態(tài)是不適用于static的方法的。也就是說在加載類的時候,編譯器調(diào)用static方法不會去檢查導出類是否對基類的static方法是否覆蓋,而是直接裝載基類的static方法。

    2)多態(tài)中的域

    class FieldSuper{
        
    public int field =0;
        
    public int getField(){
            
    return field;
        }

    }

    class FieldSub extends FieldSuper{
        
    public int field =1;
        
    public int getField(){
            
    return field;
        }

        
    public int getSuperField(){
            
    return super.field;
        }

    }

    public class FiledPolymorphism {
        
    public static void main(String[] args) {
            FieldSuper sup 
    = new FieldSub();//upcast
            System.out.println("sup.field= "+ sup.field+
                    
    ", sup.getField()"+sup.getField());
            
            FieldSub sub 
    = new FieldSub();
            System.out.println(
    "sub.field()= "+
                    sub.field
    + ", sub.getfield()= "+
                    sub.getField()
    +",sub.getSuperField() = "+
                    sub.getSuperField());
        }

    }
    //output
    sup.field= 0, sup.getField()1
    sub.field()= 1, sub.getfield()= 1,sub.getSuperField() = 0

    域在多態(tài)中是不會被覆蓋的,F(xiàn)ielddSuper.field和FieldSub.field被分配了兩個不同的存儲空間,同時在向上轉(zhuǎn)型的時候,編譯器也不會向下去找導出類是否覆蓋類的域,因此sup.field()返回了FieldSuper的field而不是FieldSub的field。對于想在導出類中獲得基類的域,就得像例子那樣通過super方法來獲取

    總結(jié):對于利用多態(tài)的向上轉(zhuǎn)型,編譯器先從向上轉(zhuǎn)型后的基類出發(fā),找出要調(diào)用的元素。根據(jù)不同元素采取不同的策略,如果是域,static以及private的方法,則不會去檢查導出類是否覆蓋這些方法(其實是不能覆蓋的)而直接調(diào)用基類的;如果是public的方法則檢查導出類是否覆蓋,覆蓋了就會調(diào)用導出類的,否則調(diào)用基類的

     

    posted on 2007-07-11 13:53 Eric-1001c 閱讀(180) 評論(0)  編輯  收藏 所屬分類: ThinkingInJava
    主站蜘蛛池模板: 久久久久亚洲AV无码专区首JN| 亚洲?v无码国产在丝袜线观看| 亚洲综合色视频在线观看| 亚洲同性男gay网站在线观看| 好湿好大好紧好爽免费视频| 日日夜夜精品免费视频| 亚洲国产成人99精品激情在线| 日韩电影免费观看| 不卡精品国产_亚洲人成在线| 国产亚洲午夜精品| 免费黄网在线观看| 亚洲国产精品免费观看| 91黑丝国产线观看免费| 精品日韩亚洲AV无码一区二区三区 | 日韩亚洲国产高清免费视频| 亚洲精品无码高潮喷水在线| 日韩免费码中文在线观看| 免费看男女下面日出水视频| 亚洲乱码国产乱码精华| 处破痛哭A√18成年片免费| 亚洲乱码一二三四区乱码| 91成人在线免费视频| 亚洲综合亚洲国产尤物| 3344免费播放观看视频| 亚洲午夜精品久久久久久人妖| 午夜不卡久久精品无码免费| 亚洲ⅴ国产v天堂a无码二区| 久久午夜无码免费| 久久精品国产亚洲AV大全| xxxx日本免费| 亚洲字幕AV一区二区三区四区| 国产精品视频免费一区二区| 亚洲人成欧美中文字幕| 青青草国产免费久久久下载| 国产成人综合亚洲| 亚洲人成人网站在线观看| 中文日本免费高清| 亚洲av日韩av激情亚洲| 99热在线免费播放| 亚洲午夜无码久久| 免费一级毛片在线播放不收费|