[英]How @Override annotation in java can check misspelling of a method?
[英]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
擴展A
, B
也將繼承sh(char x)
方法。 sh(int x)
方法不會覆蓋此方法,因為參數類型不同。 因此, B
類的對象將具有兩種不同的名為sh
方法。
但是,在您的代碼中,您聲明a1
為A
類型。 即使它(在運行時)引用類型B
的對象,據編譯器知道它仍然是類型A
因此,可以應用於此對象的方法是在A
聲明A
(及其超類 (如果有的話,但不是,除了Object
))。 您擁有的唯一方法(除Object
方法之外)是sh(char x)
。
所以當你說
a1.sh('a');
a1.sh(10);
編譯器會將其視為參數是char
,因為它將查看的唯一方法是采用char
參數的方法。 這意味着a1.sh(10)
將以“字符10”作為參數調用A
的sh
–編輯:不,不會; 我試了一下,編譯器不允許我自動將10轉換為char
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.