当前位置: 首页 > 知识库问答 >
问题:

是否可以从父类型调用子静态方法?

宁飞宇
2023-03-14

我有3个子类Child_1,Child_2,Child_3,每个都有唯一的ImagePath。

因此,我实现了公共静态字符串getImage(),因为所有实例共享相同的映像。

问题就在这里。我想从父实例p调用子静态方法。

private Image showImage(Parent p){
    Image image = null;
    try {           
        image = new Image(new FileInputStream(m.getImage()); // <- static method call
    }catch(FileNotFoundException e) {
        e.printStackTrace();
    }
    return image;
}

当然,我可以使用instanceof调用基于类的静态方法。

if(m instanceof Child_1) Child_1.getImage();
else if (m instance of Child_2) Child_2.getImage();
else Child_3.getImage();

假设我有10个子类,使用if-else语句并逐个调用它并不容易。

在Java中有没有办法从父实例调用子静态方法??

共有3个答案

史弘致
2023-03-14

正如前面提到的所有其他方法一样,Java中常用的方法是使用多态性。这意味着您可以使用抽象方法getImage()声明一个抽象类,该抽象方法可以由子类本身实现。

所以你的例子会变成这样:

public abstract class AbstractFunctionExample {

    private Image showImage(Parent p){
        Image image = null;
        try {
            image = new Image(new FileInputStream(this.getImage());
        }catch(FileNotFoundException e) {
            e.printStackTrace();
        }
        return image;
    }

    protected abstract String getImage();
}

public class ChildClass extends AbstractFunctionExample {

    private final String path;

    public ChildClass(String pathToImage) {
        this.path = pathToImage;
    }

    @Override
    protected String getImage() {
        return path;
    }
}

你有什么理由不能使用这种方法吗?

江琦
2023-03-14

这是解决问题的错误方法。对于这种类型的问题,您应该依赖多态性。

一种解决方案可能是声明一个接口ImageProcessor

public interface ImageProcessor {
  Image showImage(Parent p)
}

您所有的Child_2Child_2。。。类应该实现ImageProcessor,并编写它们的实现。

现在,您不需要使用if语句来运行特定的行为。你可以打电话给:

m.showImage(parent)
赫连瀚
2023-03-14

为什么你首先希望这个方法是静态的?你需要创建一个父类,可能是抽象的,然后使用运行时多态。

 类似资料:
  • 问题内容: 指这里 A是预编译的Java类(我也有源文件)B是我正在编写的Java类 B扩展了A。 如何实现逻辑,以便A可以调用B拥有的方法。 以下是条件: 我不想触摸A(尽管没有其他解决方案,但这只是最后一个选择)。 我不想使用反射。 如前所述,如果需要,我可以修改A。哪种方式可能是可行的解决方案? 问题答案: 类应该定义将要调用的方法(可能是抽象方法,根据Paul Haahr的出色指南,A应该

  • 问题内容: 我有一个包含静态创建方法的类。 当我使用时,它可以被编译。但是当我使用时,它编译失败,如何指定泛型? 问题答案: 假设您询问有关在类型推断失败的情况下显式指定类型的信息,则可以使用(请注意,该类型在after之后而不是before之前)。

  • 问题内容: 没有静态成员可以使用类型参数,但是可以使用泛型类型参数调用静态成员吗​​?例如:- 这里的add()是一个静态方法。 在类似的主题上也有一些C#问题和答案,但是我不太确定如何在Java中使用它。 问题答案: 不,如果A是泛型类型,则无法执行。(Bozho对fast的回答是:),可能认为A是具体类型。 可行的方法如下。 但这可能不是您想要的。 阅读您的评论后,听起来您真正想要做的是: 您

  • 问题内容: 我在基类中定义了一个静态方法,我想在其子类中重写此方法,这可能吗? 我尝试了一下,但是没有按预期工作。当我创建类B的实例并调用其callMe()方法时,将调用类A中的静态foo()方法。 问题答案: 静态方法调用在编译时解决(不动态分配)。 给

  • 问题内容: 在Python中创建简单的对象层次结构时,我希望能够从派生类中调用父类的方法。在Perl和Java中,有一个用于此的关键字()。在Perl中,我可以这样做: 在Python中,似乎必须从子代中明确命名父类。在上面的示例中,我将不得不执行。 这似乎不正确,因为这种行为使创建深层次结构变得困难。如果孩子们需要知道哪个类定义了一个继承的方法,那么就会造成各种各样的信息痛苦。 这是python

  • 问题内容: 我有以下课程 这只是我实际架构的简化版本。最初,我不知道需要创建的人员类型,因此处理这些对象创建的函数将常规对象作为参数。 现在,我想使用此父类对象访问子类的方法。我还需要不时访问父类方法,所以 我不能 使其 抽象 。 我想我在上面的示例中简化太多了,所以这是实际的结构。 if语句显示“无法为QuestionOption找到getMultiple”。OuestionOption具有更多