抽象类中的吸气剂和二传手?

时间:2015-05-15 10:38:34

标签: java abstract-class setter getter getter-setter

我正在使用Java开发游戏,我在使用抽象类中的setter和getter时遇到了问题。让我们说这堂课看起来像这样:

public abstract class Objects {
    protected int velX, velY;

    public Objects(int velX, int velY){
        this.velX = velX;
        this.velY = velY;
    }

    //getters, setters and other methods
}

现在,如果我想在不扩展抽象类对象的类中使用这些方法,则它无法正常工作。游戏将运行,但当它尝试使用getter和setter执行代码的一部分时,它会抛出NullPointerException。例如:

public class HUD {
    private Objects o;

    public HUD(......)

    public void someMethod(){
        if (o.getVelX > 0){
            o.setVelY(3);
        }
    }
}

这只是一个不好的例子,但如果我运行它会抛出NullPointerException。我是否必须以不同的方式初始化类对象?

3 个答案:

答案 0 :(得分:0)

我命令使用o,您必须通过引用扩展Object抽象类的具体类的实例来初始化它。否则o仍然为空,并且对o.something的任何调用都会引发NullPointerException。这与制定者或吸气剂无关。

答案 1 :(得分:0)

您需要为exmaple ObjectsChild创建一个新的非抽象类,然后在构造函数o中首先初始化您的HUD()对象,例如:

private Objects o;

public HUD() {
    this.o = new ObjectsChild();
}

之后,您可以在此o对象上调用getter和setter。

答案 2 :(得分:0)

定义非原始字段时,thair默认值为null,因此o字段为null。您需要在构造函数中初始化它,或者至少在调用它上面的任何方法之前。

public class HUD {
    private Objects o;

    public HUD(......){
       o = new Objects();//or a class that extends your abstract Objects class
    }

public void someMethod(){
    // at this poing you need to have o initialized
    if (o.getVelX > 0){
        o.setVelY(3);
    }
}
}

<强>更新

您可以初始化Objects实例,但这将是一个匿名类,您需要在这个地方实现所有抽象方法:

o = new Objects(){
   @Override
   public void myAbstractMethod(){
     ...
   }
}

对于NPE,您可以使用guava或JDK8中的Optional来避免它。