Java 如何初始化超类构造函数所需的子类中的参数对象?

Java 如何初始化超类构造函数所需的子类中的参数对象?,java,inheritance,constructor,superclass,Java,Inheritance,Constructor,Superclass,所以,这听起来可能有点奇怪,但让我解释一下。我有一个需要多个参数的超类。一个这样的参数是buffereImage对象。现在很明显,要在子类中初始化这个buffereImage以用作参数,我需要使用try和catch块。我能做到这一点的唯一方法是在构造函数中调用子类的方法。问题是,super()构造函数必须是子类构造函数中的第一项。因此,在调用super()之前,我无法调用方法初始化我的buffereImage。在我的子类构造函数中调用super()时,如何正确初始化我的buffereImage对

所以,这听起来可能有点奇怪,但让我解释一下。我有一个需要多个参数的超类。一个这样的参数是
buffereImage
对象。现在很明显,要在子类中初始化这个
buffereImage
以用作参数,我需要使用try和catch块。我能做到这一点的唯一方法是在构造函数中调用子类的方法。问题是,
super()
构造函数必须是子类构造函数中的第一项。因此,在调用
super()
之前,我无法调用方法初始化我的
buffereImage
。在我的子类构造函数中调用
super()
时,如何正确初始化我的
buffereImage
对象,然后再将其用作参数

示例:超级/父类

public class CombatEntity {
    BufferedImage sprite; 
    public CombatEntity(String name, BufferedImage sprite) {
        //do something
    }
}
public class Batman {
     BufferedImage sprite;
     Batman() {
         super("Bruce Wayne", sprite); //sprite hasn't been properly initalized

     }

     void getSprite() { //I need to call this method before super in order to initalize my image
          try {
              File f = new File("Batman.png");
              sprite = ImageIO.read(f);
          }

          catch(Exception e) {
              //whatever
          }

     }

}
示例:子类

public class CombatEntity {
    BufferedImage sprite; 
    public CombatEntity(String name, BufferedImage sprite) {
        //do something
    }
}
public class Batman {
     BufferedImage sprite;
     Batman() {
         super("Bruce Wayne", sprite); //sprite hasn't been properly initalized

     }

     void getSprite() { //I need to call this method before super in order to initalize my image
          try {
              File f = new File("Batman.png");
              sprite = ImageIO.read(f);
          }

          catch(Exception e) {
              //whatever
          }

     }

}

解决此问题的唯一方法是在蝙蝠侠构造函数中要求一个Image参数。这个问题并不少见,也是遵守Javabeans模式的原因之一,在Javabeans模式中,每个类都有一个空构造函数以及getter和setter。

解决这个问题的唯一方法是在蝙蝠侠构造函数中要求一个Image参数。这个问题并不少见,这也是遵守Javabeans模式的原因之一,在Javabeans模式中,每个类都有一个空构造函数以及getter和setter。

执行以下操作:

在父类中,创建普通构造函数,该构造函数采用名称和精灵参数。按照JavaBeans规范生成getter和setter方法

战斗性:

在蝙蝠侠(子)类中创建两个构造函数-一个没有参数,可以在初始化精灵图像之前使用它创建蝙蝠侠对象,另一个类似于父构造函数。当您在没有参数的情况下调用构造函数时,它会调用父构造函数并将其参数设置为默认值。然后,您可以执行GenerateScriteImage(字符串SpriteMagePath)从注入路径创建精灵图像

蝙蝠侠:


希望这对你有帮助

这样做:

在父类中,创建普通构造函数,该构造函数采用名称和精灵参数。按照JavaBeans规范生成getter和setter方法

战斗性:

在蝙蝠侠(子)类中创建两个构造函数-一个没有参数,可以在初始化精灵图像之前使用它创建蝙蝠侠对象,另一个类似于父构造函数。当您在没有参数的情况下调用构造函数时,它会调用父构造函数并将其参数设置为默认值。然后,您可以执行GenerateScriteImage(字符串SpriteMagePath)从注入路径创建精灵图像

蝙蝠侠:


希望这对你有帮助

您的
CombatEntity
可以定义一个
abstract
方法
getSprite()
,并在构造函数中调用这个方法。子类(蝙蝠侠)必须实现这个方法


这样做的好处是,在构造对象后不需要调用额外的方法(如另一个答案中所建议的)。

您的
CombatEntity
可以定义一个
抽象的
方法
getSprite()
并在构造函数中调用这个方法。子类(蝙蝠侠)必须实现这个方法


优点是在构造对象后不需要调用额外的方法(如另一个答案中所建议的)。

Javabeans模式?空构造函数?能手和二传手?我从来没有听说过这些事情。你能详细说明一下吗?谢谢,Javabeans模式?空构造函数?能手和二传手?我从来没有听说过这些事情。你能详细说明一下吗?谢谢。好吧,看完这个答案后,我觉得自己像个十足的白痴。因为我从来没有像这样使用过构造函数,我忘了一个类可以有多个构造函数。大脑放屁。。。但无论如何,谢谢你!这对我很有帮助。另外@ControlAltDel谢谢你,因为你也这么说。这就是多态性的力量。:)很高兴帮助你!好吧,看完这个答案后,我觉得自己像个十足的白痴。因为我从来没有像这样使用过构造函数,我忘了一个类可以有多个构造函数。大脑放屁。。。但无论如何,谢谢你!这对我很有帮助。另外@ControlAltDel谢谢你,因为你也这么说。这就是多态性的力量。:)很高兴帮助你!好的,谢谢你,埃里克。我也一定会考虑这个办法的!好的,谢谢你,埃里克。我也一定会考虑这个办法的!