簡體   English   中英

Java方法的重載和繼承

[英]Java method overriding and inheritance

class Dad {
    private static final String me = "dad";
    protected  String getMe() {
        return me;
    }
    protected  void printMe() {
        System.out.println(getMe());
    }
}

class Son extends Dad {
    private static final String me = "son";
    protected  void printMe() {
       System.out.println(getMe());
    }
}

class Test {
    public static void main(String[] args) {
        Son son = new Son();
        son.printMe();
    }
}

在這種情況下,引用類型為“ Son”的“ son”,並且由於方法printMe()是非靜態的,因此將執行來自類Son的方法的代碼。 但是,由於Son類尚未重新定義方法getMe(),因此將執行祖先類中的方法代碼。 所以我們得到“爸爸”。

第二種情況:

class Dad {
    private static final String me = "dad";
    protected  String getMe() {
        return me;
    }
    protected  void printMe() {
        System.out.println(getMe());
    }
}

class Son extends Dad {
    private static final String me = "son";
    protected  String getMe() {
        return me;
   }


class Test {
    public static void main(String[] args) {
        Son son = new Son();
        son.printMe();
    }
}

在這種情況下,Son類沒有以類似的方式進行推理,因此未執行方法printMe()的定義,因此應執行類Dad中方法printMe()的代碼。 但是我們得到“兒子”。為什么?

然后繼承呢? 也就是說,如果繼承人沒有覆蓋祖先方法,那么他們一起共享祖先方法的代碼嗎?

在第一種情況下, son.printMe()調用SonprintMe() (因為Son重寫了該方法),后者調用了DadgetMe() (因為Son沒有重寫該方法),該方法返回“ dad”。

在第二種情況下, son.printMe()調用DadprintMe() (因為Son並未重寫該方法),后者又調用SongetMe() ,因為Son重寫了該方法。 因此,“兒子”被打印。

在第二種情況下,您要調用Dad#printMe ,后者依次調用getMe 由於Son確實覆蓋了它, Son#getMe將調用Son#getMe 該方法返回“ Son”,然后由printMe打印。

您正在使用tge diff類覆蓋相同的方法,但是參數相同,因為tge main方法正在調用son方法

案例2: son.printMe()將調用DadprintMe()作為未未在everriden Son類。 現在它將在getMe()中最接近的實現類(即SongetMe()中查找getMe() 現在, Son#getMe()將在此實現類中尋找變量me ,並找到值"son" ,因此將其打印出來。 請記住, private static final String me = "dad"; private static final String me = "son"; 是兩個不同的私有變量,屬於兩個不同的類。 如果Son類中沒有定義me變量,則將出現編譯錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM