【问题标题】:Inheritance resulting null value in the subclass在子类中继承产生空值
【发布时间】:2021-08-24 19:16:04
【问题描述】:

当我直接使用超类时它工作正常,但是当我尝试使用子类打印出值时它返回一个空值。 我创建了 2 个类用于显示和记录目的,假设“房间”读取并存储在用户做出选择后将记录到文本文件中的值,而“房间视图”用于显示用户的正常输入读书。 我曾尝试将 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

【问题讨论】:

  • 我忘记发布文本文件了,这里是:RS11 RT1 1 1 RD12 RT2 1 0 RS13 RT1 1 0 RD14 RT2 1 1 RS15 RT1 1 1 RD16 RT2 1 0 RS17 RT1 1 1 RD18 RT2 1 1 RS19 RT1 1 0 RS21 RT1 2 1 RD22 RT2 2 0 RS23 RT1 2 1 RD24 RT2 2 1 RS25 RT1 2 1 RD26 RT2 2 0 RS27 RT1 2 1 RD28 RT2 2 0 RS29 RT1 2 0 RS31 RT1 3 0 RD32 RT2 3 0 RS33 RT1 3 0 RD34 RT2 3 0 RS35 RT1 3 0 RD36 RT2 3 0 RS37 RT1 3 1 RD38 RT2 3 1 RS39 RT1 3 1 RS41 RT1 4 1 RD42 RT2 4 0

标签: java inheritance polymorphism


【解决方案1】:

不要重新声明字段。但首先:RoomFrontEnd 是一个奇怪的名字,它暗示你不了解子类化的用途。想想Dog extends MammalMammal extends Animal - 子类就像继承类型已经是一种更具体的类型。 RoomFrontEndRoom 完全不同。

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

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

【讨论】:

    【解决方案2】:

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

    所以,当设置器设置不同级别的值时:

    • setRoomTypeIDsetRoomStatuschild 类中被覆盖,各自的值在 RoomFrontEnd 中更新。
    • setRoomIDsetFloor 未被覆盖,并且值在 parent 类字段中设置,因此将值保留在子类 null 中。

    然后,toString 在父类和子类中都定义了,并且该方法引用了自己级别的字段。

    解决方法很简单:

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

    【讨论】:

      猜你喜欢
      • 2014-01-25
      • 2011-04-02
      • 2023-03-27
      • 2018-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多