簡體   English   中英

如何檢查方法是否覆蓋

[英]how to check a method override or not

我有兩個問題1覆蓋2編譯時綁定
嗨,我想知道我如何檢查sh()成為替代

方法參數在方法重寫中起什么作用嗎?

為什么我們說靜態方法在編譯時綁定,而實際上靜態方法在類加載時分配內存? 當我使用javac工具時,這意味着我使用編譯器並編譯了一個java文件,因此當靜態內存未分配時,靜態內存分配了類加載時間,那么為什么要說靜態方法使用編譯時綁定

類的加載時間與編譯時間相同嗎? 我感到困惑

我知道這里的方法簽名是不同的,所以這里沒有覆蓋比實際發生的解釋

class A
    {
        void sh(char x){
        System.out.println("value of x :  "+x);
        }
    }
    class B extends A
    {
        public void sh(int x)
        {
            System.out.println("value of x"+x);
        }
    }
    class C
    {
        public static void main(String...Aa) /* ??? */
        {
            A a1=new B();
            //a1.show();
            a1.sh('a');
            a1.sh(10);
        }
    } 

Java語言規范說明

如果滿足以下所有條件,則在類C中聲明的實例方法m1覆蓋在類A中聲明的另一個實例方法m2:

  • C是A的子類。

  • m1的簽名是m2的簽名的子簽名(第8.4.2節)。

  • 要么:

    • m2是公共的,受保護的或具有默認訪問權限的聲明,並且與C處於同一包中,或者

    • m1覆蓋方法m3(不同於m1的m3,不同於m2的m3),因此m3覆蓋m2。

  • 而且,如果m1不是抽象的,則稱m1實現了它所覆蓋的抽象方法的所有聲明。

subsignature的定義在這里 你問

方法參數在方法重寫中起什么作用嗎?

根據以上所述,是的。 您的簽名必須匹配。 換一種說法

public void sh(int x)

不覆蓋

void sh(char x){

為什么我們說靜態方法在編譯時綁定,而實際上靜態方法在類加載時分配內存?

在編譯時,將對引用的靜態或聲明的類型解析方法調用。 換句話說,如果類型未聲明這種方法,則程序將無法編譯。 對於static方法。 如果該方法是static ,則該方法將立即解析並綁定到其調用的類型。 如果是instance方法,則綁定將通過多態性動態解析(后期綁定)。

這些都與類加載或分配內存無關。

我不清楚你在問什么。 但是,當B擴展AB也將繼承sh(char x)方法。 sh(int x)方法不會覆蓋此方法,因為參數類型不同。 因此, B類的對象將具有兩種不同的名為sh方法。

但是,在您的代碼中,您聲明a1A類型。 即使它(在運行時)引用類型B的對象,據編譯器知道它仍然是類型A 因此,可以應用於此對象的方法是在A聲明A (及其超類 (如果有的話,但不是,除了Object ))。 您擁有的唯一方法(除Object方法之外)是sh(char x)

所以當你說

a1.sh('a');
a1.sh(10);

編譯器會將其視為參數是char ,因為它將查看的唯一方法是采用char參數的方法。 這意味着a1.sh(10)將以“字符10”作為參數調用Ash –編輯:不,不會; 我試了一下,編譯器不允許我自動將10轉換為char

暫無
暫無

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

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