类测试的意外输出

时间:2015-12-07 04:43:11

标签: java compilation compiler-errors compiler-warnings

我有以下代码:

import java.util.*;

public class Room {

    ArrayList<Bed> beds = new ArrayList<Bed>();

    private int BedNumber;

    public void createBed(boolean isDouble) {

        beds.add(new Bed(isDouble));

        BedNumber++;
    }

    public int howManyBeds() {
        return BedNumber;
    }

    public static void main(String[] args) {
        Room p = new Room();
        p.createBed(true);
        p.createBed(false);
        Bed test = p.beds.get(0);
        System.out.println(test);
    }

}

public class Bed {

    private boolean isDouble;

    public Bed(boolean isDouble) {
        this.isDouble = isDouble;

    }

    public String bedSize() {

        if (isDouble) {
            return "Double Bed";
        } else {
            return "Single Bed";
        }
    }


}

当我编译它时,Eclipse通知我代码中存在错误并询问我是否要继续。当我这样做时,我最终得到一个完全出乎意料的输出 - Bed @ 14ae5a5

我对可能造成这种情况的原因感到困惑。我想它有点简单,但我只是没有看到它。

任何人都能看到我失踪的东西吗?

更新----

发现我在下面更正的错误。我正在打印对象引用而不是调用方法...

现在打印正确的结果,然而,Eclipse仍然告诉我编译时出了问题。

我的代码写得不好吗?任何人都可以确定Eclipse为什么不开心?

2 个答案:

答案 0 :(得分:0)

您的编译错误是由于您尝试在一个Java文件中声明两个公共类。

对于输出,您正在尝试打印Bed对象 - 这会导致打印Object.toString()。

public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

因此,它打印了类的名称“Bed”,带有@符号后跟其散列的十六进制值14ae5a5。

答案 1 :(得分:0)

println System.out方法实际调用参数的toString方法,在本例中为床。但是,toString课程中不存在Bed!那它做了什么?它调用toString Object方法,返回Bed@XXXX,其中XXXX是您床位的记忆位置。

要解决此问题,只需在您的课程中添加toString方法即可。请务必添加@Override以覆盖toString

Object方法
@Override
public String toString () {
    //return a string representation here
}