Java从子类运行构造函数

时间:2015-06-08 14:46:24

标签: java constructor attributes subclass

这是我的类Mappa,它有mappaName作为构造函数的主要属性

public class Mappa {
    private Name mappaName;
    protected Settore [][] settore;
    private int Matrice [][];
    private static final int X=14;
    private static final int Y=23;
    public Mappa (Name mappaName){
        this.mappaName=mappaName;
        settore = new Settore[X][Y];
        for (int i=0; i < X; i++){
            for (int j=0; j<Y; j++) {
                settore[i][j] = new Settore (i,j);
            }
        }
        Matrice = new int[X][Y];
        if(mappaName==Name.FERMI){
            settore[8][10]=new Alieni(8,10);
            settore[9][10]=new Umani(9,10);
        }
        if(mappaName==Name.GALILEI||mappaName==Name.GALVANI){
            settore[5][10]=new Alieni(5,10);
            settore[7][10]=new Umani(7,10);
        }
    }
}

这是子类MappaFermi,它只运行Mappa类的构造函数,将mappaName设置为Name.FERMI

public class MappaFermi extends Mappa {
    public MappaFermi() {
        super(null);
        new Mappa(Name.FERMI);
    }

new Mappa(Name.FERMI);是不是应该将mappaName设置为Name.FERMI,因为if条件设置为settore[8][10]=new Alieni(8,10);settore[9][10]=new Umani(9,10);?因为当我进行测试时,它返回null而不是预期的值。

public class MappaFermiTest {
    @Test
    public void testMappaFermiNome(){
        Mappa mappa = new MappaFermi();
        assertEquals(Name.FERMI, mappa.getMappaName());
    }
    @Test
    public void testMappaFermiAlieni(){
        Mappa mappa = new MappaFermi();
        assertEquals(Nome.ALIENI, mappa.getSettori()[8][10].getSettoreNome());
    }
}

1 个答案:

答案 0 :(得分:1)

您似乎对new关键字的作用有些误解。

new调用构造函数并返回类的新实例。这意味着你的

public MappaFermi() {
    super(null);
    new Mappa(Name.FERMI);
}

实际上在调用Mappa(这是实际的父构造函数调用)之后创建了一个新的super对象,然后将其丢弃。

你真的想做

public MappaFermi() {
    super(Name.FERMI);
}