2011-04-06 79 views
0

是否有可能編譯父類的java類子, 調用子類的方法不要求父類的加載。在沒有類加載父類的情況下調用子類方法?

可以編譯或運行某些高級選項。

例如 我有3類

public class Parent { 
    public void baseMethod(){ 
     System.out.println("Parent.baseMethod invoked"); 
    } 
} 

public class Child extends Parent{ 
    public void childMethod(){ 
     System.out.println("Child.childMethod invoked"); 
    } 

} 

public class Main { 
    public static void main(String[] args) { 
     new Child().childMethod(); 
    } 
} 

我編譯,以及刪除Parent.class。

我想運行

java Main 

沒有exeption

+0

爲什麼你想這樣做,想要什麼家長? – 2011-04-06 07:31:56

+1

如果你想刪除父類,那麼你不需要它的方法和屬性。如果你不需要它的方法和屬性,你爲什麼要擴展它? – 2011-04-06 07:35:58

+0

除了明顯需要加載父類[導致NoClassDefFoundError]外,Child的不可見構造函數確實包含對超級構造函數的調用。所以你不能編譯,你可以用Parent類運行時間。 – bestsss 2011-04-06 07:55:03

回答

4

號路。 Java將始終加載超類。超類是要求來創建實際的實例。

創建一個新的Child會做一個隱式調用Parent(),當你需要的Parent加載那。


PS - 甚至不工作,如果你只是想呼籲子類的靜態方法,像:

public class Parent {} 
public class Child {public static void hello(){System.out.println("hello");}} 
public class Caller{public static void main(String[] args){Child.hello();}} 

刪除Parent.class將拋出一個NoClassDefFoundError即使沒有Child實例是曾經創造。

3

沒有

它將載入父類,這就是爲什麼繼承是存在的。

extends Parent談到它會尋找Parent類加載它使關係

請參見

+0

爲鏈接+1。我搜查自己,沒有提出任何類似的東西。我很驚訝這篇教程沒有深入討論。 – 2011-04-06 08:04:49

1

繼承手段:孩子IS父母,所以你不能。

2

它不工作的方式。

當一個類被加載時,首先加載它所有的超類。如果找不到,班級將無法加載。

0

您必須加載超級類或類才能加載類。

你,如果這是不可取的,唯一的選擇就是

  • 使孩子不再是一個子類的父的,無論是在代碼或與字節碼操作運行。
  • 更換爲另一版本,你想要做什麼,或者不你不(在代碼或在運行時再次)
相關問題