子类中继承产生空值

Inheritance resulting null value in the subclass

当我直接使用超类时它工作正常,但是当我尝试使用子类打印出值时它 returns 一个空值。 我创建了 2 类 用于显示和记录目的,假设“room”读取并存储将在用户做出选择后记录到文本文件中的值,而“roomView”用于显示正常输入用户要阅读。 我已经尝试将 setRoomID 和 getRoomID 放入子类中,它起作用了,但我认为如果我将所有 getter 和 setter 放入子类中,继承将毫无意义。 下面是我的超类:

public class Room {

    private String roomID;
    private String roomTypeID;
    private Integer floor;
    private String roomStatus;

    //Setter
    public void setRoomID(String roomID) {
        this.roomID = roomID;
    }

    public void setRoomType(String roomTypeID) {
        this.roomTypeID = roomTypeID;
    }

    public void setFloor(Integer floor) {
        this.floor = floor;
    }

    public void setRoomStatus(String roomStatus) {
        this.roomStatus = roomStatus;
    }

    //Getter
    public String getRoomID() {
        return this.roomID;
    }

    public String getRoomType() {
        return this.roomTypeID;
    }

    public Integer getFloor() {
        return this.floor;
    }

    public String getRoomStatus() {
        return this.roomStatus;
    }

    public String toString() {
        return roomID + " " + roomTypeID + " " + floor + " " + roomStatus;
    }
}

下面是我的子类:

public class RoomFrontEnd extends Room {

    private String roomID;
    private String roomType;
    private Integer floor;
    private String roomStatus;

    public void setRoomTypeID(Integer roomTypeID) {
        if (roomTypeID.equals("RT1")) {
            this.roomType = "Single Room";
        } else if (roomTypeID.equals("RT2")) {
            this.roomType = "Double Room";
        }
    }

    @Override
    public String getRoomTypeID() {
        return this.roomType;
    }

    public void setRoomStatus(String roomStatus) {
        if (roomStatus.equals("1")) {
            this.roomStatus = "Available";
        } else if (roomStatus.equals("0")) {
            this.roomStatus = "Not Available";
        }
    }

    @Override
    public String getRoomStatus() {
        return this.roomStatus;
    }

    @Override
    public String toString() {
        return roomID + " " + roomType + " Floor " + floor + " " + roomStatus;
    }
}

在我的试车手下方:

public class Test3 {

    public static void main(String[] args) {
        Room[] room = new Room[72];
        RoomFrontEnd[] roomView = new RoomFrontEnd[72];
        Integer i = 0;
        try {
            File RoomTxt = new File("Room.txt");
            Scanner read = new Scanner(RoomTxt);
            while (read.hasNextLine()) {
                room[i] = new Room();
                room[i].setRoomID(read.next());
                room[i].setRoomTypeID(read.next());
                room[i].setFloor(read.nextInt());
                room[i].setRoomStatus(read.next());
                i++;
            }
            read.close();
        } catch (FileNotFoundException e) {
            System.out.println("An error occurred.");
            e.printStackTrace();
        }

        for (i = 0; i < 72; i++) {
            roomView[i] = new RoomFrontEnd();
            roomView[i].setRoomID(room[i].getRoomID());
            roomView[i].setRoomTypeID(room[i].getRoomTypeID());
            roomView[i].setFloor(room[i].getFloor());
            roomView[i].setRoomStatus(room[i].getRoomStatus());
        }

        for (i = 0; i < 72; i++) {
            System.out.println(roomView[i].toString());
        }
    }
}

我在 运行 测试驱动程序时得到的输出:

null null Floor null Available
null null Floor null Not Available
null null Floor null Not Available
null null Floor null Available
null null Floor null Available
null null Floor null Not Available
null null Floor null Available
null null Floor null Available
null null Floor null Not Available
null null Floor null Available
null null Floor null Not Available
null null Floor null Available
null null Floor null Available
null null Floor null Available
null null Floor null Not Available
null null Floor null Available
null null Floor null Not Available
null null Floor null Not Available
null null Floor null Not Available
null null Floor null Not Available
null null Floor null Not Available
null null Floor null Not Available
null null Floor null Not Available
null null Floor null Not Available
null null Floor null Available
null null Floor null Available
null null Floor null Available
null null Floor null Available
null null Floor null Not Available
null null Floor null Available
null null Floor null Not Available
null null Floor null Not Available
null null Floor null Not Available
null null Floor null Available
null null Floor null Not Available
null null Floor null Not Available
null null Floor null Available
null null Floor null Available
null null Floor null Not Available
null null Floor null Not Available
null null Floor null Not Available
null null Floor null Available
null null Floor null Not Available
null null Floor null Available
null null Floor null Not Available
null null Floor null Available
null null Floor null Available
null null Floor null Available
null null Floor null Not Available
null null Floor null Not Available
null null Floor null Not Available
null null Floor null Available
null null Floor null Not Available
null null Floor null Not Available
null null Floor null Not Available
null null Floor null Available
null null Floor null Available
null null Floor null Available
null null Floor null Available
null null Floor null Available
null null Floor null Available
null null Floor null Not Available
null null Floor null Not Available
null null Floor null Available
null null Floor null Available
null null Floor null Available
null null Floor null Available
null null Floor null Available
null null Floor null Available
null null Floor null Available
null null Floor null Available
null null Floor null Available

不要重新声明字段。但首先:RoomFrontEnd 是一个奇怪的名字,表明您不了解 subclassing 的用途。想想 Dog extends Mammal, Mammal extends Animal - subclass 就像继承类型已经是的一种更具体的类型。 RoomFrontEndRoom 完全不同。

一旦你解决了这个问题,你的 RoomFrontEnd class 就会有 2 个完全不相关的字段,都称为 roomID。当您 运行 roomID = foo 时,您将设置两者之一。

因此:不要在 RoomFrontEnd 中再次 声明这些字段 。 RoomFrontEnd 是一个 Room 附加的东西。因此,您会自动获得已在 RoomFrontEnd 中声明的所有字段 Room

此示例中的继承被破坏,因为子 class RoomFrontEnd 中的字段重复,因此隐藏了父 class Room 中的字段。

因此,当设置者在不同级别设置值时:

  • setRoomTypeIDsetRoomStatuschild class 中被覆盖,相应的值在 RoomFrontEnd 中更新。
  • setRoomIDsetFloor 未被覆盖,值在 parent class 字段中设置,从而将值保留在子字段中class null.

然后,toString 在父子 class 中定义,此方法在其自身级别引用字段。

解决方法很简单:

  • 删除子字段中的声明 class RoomFrontEnd