为什么Object在属性时不能使用构造函数?

时间:2015-10-01 02:01:23

标签: java object constructor attributes

我在一个类中有这个属性,它也是一个对象。出于某种原因,每当我尝试使用构造函数时,它都会给我一个空指针异常。

这是对象的类:

    public class Posicion
{
    private int filas;
    private int columnas;

    public void Posicion(int x, int y)
    {
        filas = x;
        columnas = y;
    }
}

这是将对象作为属性的类:

public class Casillas
{
    protected char simbolo;
    protected Posicion coordenadas;

    public void Casillas(char simbolo, Posicion coordenadas) 
    {
        this.simbolo = simbolo;
        this.coordenadas = coordenadas;
    }
}

这就是我得到Null指针异常的地方(“inicio”方法的第一行):

public class R2D2 extends Casillas
{
    public R2D2 inicio(int x, int y)
    {
        coordenadas.Posicion(x, y);

        R2D2 art = new R2D2();
        art.Casillas('A', coordenadas);

        return art;
    }
}

我感谢所有可以得到的反馈。

编辑:这是java语言。

2 个答案:

答案 0 :(得分:6)

您正在呼叫coordenadas.Posicion(x, y);,但coordenadas从未初始化,Posicion()constructor - 为了调用它,您应该使用new } keyword:

public class R2D2 extends Casillas
{
    public R2D2 inicio(int x, int y)
    {
        // instead of this:
        //coordenadas.Posicion(x, y);

        // do:
        coordenadas = new Posicion(x, y);

        R2D2 art = new R2D2();
        art.Casillas('A', coordenadas);

        return art;
    }
}

此外,构造函数不声明返回类型,因此更改:

public void Casillas(...

为:

public Casillas(...

public void Posicion(...

为:

public Posicion(...

另一个错误是:

art.Casillas('A', coordenadas);

再次 - 这不是你应该如何调用构造函数。我建议修复这个错误 - 但我不确定你在这里做什么。

答案 1 :(得分:2)

你的“Casillas”和“Posicion”构造函数返回void,当你用Java编写构造函数时,你没有指定一个返回类型(它返回一个指向新构造的对象的指针)。

因为你的构造函数没有正确编写,所以编译器不会“知道”它们是构造函数,并且创建它自己的默认构造函数,它只会分配一些内存,并返回指向该内存的指针。因此,“coordenadas”变量永远不会被初始化,并保留其默认值“null”。