public abstract class Test { public static void test(){ } public abstract void test(); }
我觉得这样可以的啊~~为什么编译失败。
认证0级讲师
這是因為靜態方法和實例方法的簽章不能相同,因為java允許在實例物件上呼叫類別靜態方法,正是因為有這個允許,所以不能有相同簽章的方法,看例子:
public class Test { // public void main(String[] args) {} // Error public static void main(String[] args) { Test.hello(); // OK new Test().hello(); // OK } public static void hello() { System.out.println("hi"); } }
那你說jvm該執行誰呢? 就是都是正常的方法也不能同名同參啊,jvm會傻的
方法簽章:由方法名稱和參數資料據型決定方法唯一性
上面兩個方法方法名稱和參數一致,導致在編譯編譯過程中報錯
TestMethod.java:6: 錯誤: 在類別 TestMethod中定義了方法 test() public void test(){ ^ 1 个错误
TestMethod.java:6: 錯誤: 在類別 TestMethod中定義了方法 test()
public void test(){ ^ 1 个错误
這與Java的動態綁定特性有關
不管是靜態還是抽象方法都是類別來定義的,既然都是類別來定義那它們肯定不能同名同參。
java中的重載和重寫,也不容許有這樣的規則。
這是因為靜態方法和實例方法的簽章不能相同,因為java允許在實例物件上呼叫類別靜態方法,正是因為有這個允許,所以不能有相同簽章的方法,看例子:
那你說jvm該執行誰呢?
就是都是正常的方法也不能同名同參啊,jvm會傻的
方法簽章:由方法名稱和參數資料據型決定方法唯一性
上面兩個方法方法名稱和參數一致,導致在編譯編譯過程中報錯
這與Java的動態綁定特性有關
不管是靜態還是抽象方法都是類別來定義的,既然都是類別來定義那它們肯定不能同名同參。
java中的重載和重寫,也不容許有這樣的規則。