我知道Java方法可以在同一個(gè)類或子類中重載。但是我可以在非子類中重載Java靜態(tài)方法嗎?我對(duì)下面的代碼有點(diǎn)困惑。class A {
public static void main(String[] args) {
System.out.println("Inside main's (String[]) method");
}}class B {
public static void main(int[] args) { // [1, 2, 3]
System.out.println("Inside main's (int[]) method");
}}public class _2b_Overloading_Staticmethod_NonSubClass {
// JVM's entry point
public static void main(String[] args) {
A.main(args);
B.main(new int[]{1,2,3});
}}
2 回答

忽然笑
TA貢獻(xiàn)1806條經(jīng)驗(yàn) 獲得超5個(gè)贊
另外,還有一些來(lái)自JLS的備份,加上一堆例子。
超載
來(lái)自JLS§8.4.9:
如果一個(gè)類的兩個(gè)方法(無(wú)論是在同一個(gè)類中聲明,還是由一個(gè)類繼承,或者一個(gè)是聲明的,一個(gè)是繼承的)都具有相同的名稱,但簽名不是覆蓋等效的,那么方法名稱就是超載。
這對(duì)靜態(tài)成員來(lái)說(shuō)很重要......
class?Foo?{ ????static?int?someStaticMethod(String?s)?{ ????????return?0; ????} ????static?int?someStaticMethod(String?s,?boolean?b)?{ ????????return?0; ????}}
......以及非靜態(tài)的:
class?Foo?{ ????int?someMethod(String?s)?{ ????????return?0; ????} ????//?Method?overloading ????int?someMethod(String?s,?boolean?b)?{ ????????return?0; ????}}
如果一個(gè)類從另一個(gè)類繼承一個(gè)方法,也會(huì)出現(xiàn)重載:
class?Bar?extends?Foo?{ ????//?This?is?also?a?case?of?overloading,?because?Bar?inherits ????//?someMethod(String)?from?Foo ????int?someMethod(String?s,?double?d,?boolean?b)?{ ????????return?0; ????}}
但
如果兩種方法都不相關(guān),盡管名稱相同,但它們永遠(yuǎn)不會(huì)被稱為超載。
這是兩種非靜態(tài)方法的情況
class?Alpha?{ ????void?anotherMethod(String?s)?{?}}class?Bravo?{ ????//?No?overloading?involved ????void?anotherMethod(boolean?b)?{?}}
以及靜態(tài)方法:
class?Charlie?{ ????static?void?someThirdMethod(String?s)?{?}}class?Delta?{ ????//?No?overloading?involved ????static?void?someThirdMethod(boolean?b)?{?}}
對(duì)于靜態(tài)成員,如果其中一個(gè)類繼承了另一個(gè),則情況甚至如此:
class?Echo?{ ????static?void?lastMethod(String?s)?{?}}class?Foxtrot?extends?Echo?{ ????//?No?overloading?involved.?Static?members?are?never?inherited, ????//?so?effectively,?these?two?methods?are?unrelated ????static?void?lastMethod(boolean?b)?{?}}
添加回答
舉報(bào)
0/150
提交
取消