在没有类加载父类的情况下调用子类方法?

时间:2011-04-06 07:29:51

标签: java parent-child classloader

是否可以编译父类的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

没有例外

5 个答案:

答案 0 :(得分: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

答案 1 :(得分:3)

它将加载Parent类,这就是继承存在的原因。

extends Parent出现时,它会查找Parent类并加载它以建立关系

另见

答案 2 :(得分:2)

这不起作用。

加载类时,首先加载所有的超类。如果无法找到它们,则无法加载该类。

答案 3 :(得分:1)

继承意味着:孩子 IS 父母,所以你不能。

答案 4 :(得分:0)

您必须加载超类或类才能加载类。

如果不希望这样做,唯一的选择是

  • 使用子代码操作,使子代不再是父代的子类,无论是在代码中还是在运行时。
  • 将父替换为您想要的其他版本,或者不执行您不想要的版本(再次在代码中或在运行时)