初始化到父java后调用子类方法

初始化到父java后调用子类方法,java,Java,这可能听起来很愚蠢,但我被卡住了,我找不到解决问题的正确方法。 我有一个超类和两个子类扩展它。在基于条件的父类上,我想从两个类中的任何一个调用该方法。这是在一个循环中,所以我决定不做同样的检查,只做一次检查,而是从超类创建一个对象,然后将该对象更改为两个子类中的任何一个。i、 e public class Parent{ public void method() { Parent object=new Parent(); if(a==b) {

这可能听起来很愚蠢,但我被卡住了,我找不到解决问题的正确方法。 我有一个超类和两个子类扩展它。在基于条件的父类上,我想从两个类中的任何一个调用该方法。这是在一个循环中,所以我决定不做同样的检查,只做一次检查,而是从超类创建一个对象,然后将该对象更改为两个子类中的任何一个。i、 e

public class Parent{
    public void method() {
        Parent object=new Parent();
        if(a==b) {
            object=new Child_A();
        }else {
            object=new Child_B();
        }
        for() {
            object.method();
        }
    }
    public void method() {
        //empty method. need it just to compile
    }
}

public class Child_A extends Parent{
    public void method() {
        //do something useful
    }
}

public class Child_A extends Parent{
    public void method() {  
        //do something useful
    }
}
我必须编写Parent.method,否则编译器会抱怨类Parent上没有方法。 因此,调用的方法不是子方法之一,而是父方法。 我已经读到,对象需要直接分配给类,比如Childen_A object=new Childen_A。问题是,我希望对这两种情况使用相同的命令object.method,无论它引用哪个类。奇怪的是,在调试期间,我看到对象的类型是Child_A,但是调用了super方法。 我知道解决方案是创建两个不同的对象,每个子类一个,但这会使我的代码更难看,我必须在循环中使用if语句

public void method() {
   for() {
       if(a=b) {
            Child_A object=new Child_A();
            object.method();
       }else {
            Child_B() object=new Child_B();
            object.method();
        }
    }
}
有没有办法避免循环中的if语句?谢谢

您的代码应该是

public class Parent {

    public void method() {

    }

    // OR

    public abstract void method(); // and make the class abstract as well
}

public class Child_A extends Parent {

    @Override
    public void method() {
        //do something useful
    }
}

// same with Child_B

听起来您应该覆盖子类中的方法。父类几乎永远不应该知道其/实际上关心/甚至创建其子类的实例。ifa=b这是一个赋值,而不是一个条件。嗯,最佳解决方案:阅读更多关于继承和重写以及如何使用多态性链接两者的信息。对于当前的方法,您可以得到一些可行的解决方案,但最好是避免使用当前的方法。应该有第三个实体类来管理对象的创建。父类即使知道其子类的名称,也意味着父类对其子类的依赖性不好。避免它。@BenjaminUrquhart编辑它。@nits.kk代码几乎只用一个类,没有继承或任何东西。然后这种需要被唤起,所以我不得不想办法解决它。创建第三个类来处理执行并保持这三个类的原样,现在太麻烦了。谢谢,这样做了。我得到的印象是,默认情况下继承方法会覆盖超级方法。不要记得经常使用@Override符号。谢谢again@SkarosIlias如果名称匹配,则会覆盖它@重写只是确保您不会通过键入或重构破坏代码。它确实具有相同的名称和参数,甚至返回类型。我觉得很奇怪。无论如何,再次谢谢你