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谢谢你,因为你也这么说。这就是多态性的力量。:)很高兴帮助你!好的,谢谢你,埃里克。我也一定会考虑这个办法的!好的,谢谢你,埃里克。我也一定会考虑这个办法的!