Java 抽象类中的getter和setter?

Java 抽象类中的getter和setter?,java,abstract-class,setter,getter,getter-setter,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 ot

我正在用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);
        }
    }
}
private Objects o;

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

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

为了使用
o
,必须通过引用扩展对象抽象类的具体类的实例来初始化它。否则,
o
保持为空,对
o.something
的任何调用都会抛出
NullPointerException
。这与setter或getter无关。

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

public class HUD {
    private Objects o;

    public HUD(......)

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

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

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

定义非基本字段时,默认值为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);
    }
}
}
更新

您可以初始化
对象
实例,但这将是一个注释性类,您需要在此处实现所有抽象方法:

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

至于NPE,您可以使用guava或JDK8来避免它。

是的,您需要实例化
对象来执行getter/setter,前提是getter/setter是公共的。对象是否在构造函数HUD中初始化(……)?否则它将为null,您将得到NullPointerException是的,它们是公共的。我不能实例化对象,因为它是抽象的。我不会在HUD构造函数中调用super()来使用您需要的抽象类对其进行子类化。然后,
getVelX()
,如果public或protected方法的行为与您的类中类似。如果对象和HUD之间的关系不是一个简单的关系,那就要过度考虑你的类设计。抽象类的要点是你需要实例化一个子类来利用它。如果您没有实例化子类,请使其不抽象并实例化类本身。不是
对象
抽象并且他不能创建实例吗?是的,我不能这样做。@wonderb0lt看看我的更新,您可以初始化抽象类的实例,您只需要就地实现所有抽象方法。