我最近被要求将使用继承的类重写为使用组合的类。我在重写toString()方法时遇到了一个问题。方法toString()不会返回字符串值,我没有收到运行时错误或编译错误。我最终将返回值更改为void以及要输出的方法名称。所以而不是返回我使用system.out
的字符串值我尝试使用toString
public String toString()
{
return String.format(
"%s: %s %s\n%s: %s\n%s: %.2f\n%s: %.2f\n%s: %.2f\n%s: %.2f",
"based-salaried commission employee", cEmp.getFirstName(), cEmp.getLastName(),
"social security number", cEmp.getSocialSecurityNumber(),
"gross sales", cEmp.getGrossSales(),
"commission rate", cEmp.getCommissionRate(),
"base salary",baseSalary,
"earnings", earnings());
}
与我达成的协议
public void outPut()
{
System.out.printf(
"%s: %s %s\n%s: %s\n%s: %.2f\n%s: %.2f\n%s: %.2f\n%s: %.2f",
"based-salaried commission employee", cEmp.getFirstName(), cEmp.getLastName(),
"social security number", cEmp.getSocialSecurityNumber(),
"gross sales", cEmp.getGrossSales(),
"commission rate", cEmp.getCommissionRate(),
"base salary",baseSalary,
"earnings", earnings());
}
我的问题是,当我使用toString()方法时,为什么不从javac接收编译或运行时错误,如果没有错误,为什么不返回字符串值。
希望这个问题不是太奇怪。
答案 0 :(得分:1)
Object(所有java对象最终继承的类)定义了它自己的toString()方法。因此,如果您没有覆盖类中的toString()方法,那么它将使用Object()中定义的方法(或类和Object之间的任何中间类)。
这就是为什么,如果你没有定义toString()方法,你就不会从javac中得到错误。
这通常会产生类似
的字符串System.out.println("o=" + new Object().toString())
o=java.lang.Object@1176e5f
答案 1 :(得分:1)
Matthew回答了第一个问题(为什么没有编译错误)。关于第二个:
至于我的理解实例方法在Java中是虚拟的,在每种情况下都会调用实际对象的方法。因此,我想知道没有产生预期结果的代码:)
可能的错误:可能存在一些微不足道的布线错误。 IE浏览器。错误使用/测试用例:例如,使用/测试不同类的不同对象 - 与您实现的不同。或编译错误:您的代码尚未编译,测试时使用另一个(可能是旧的)版本。或类似的“琐碎”问题:)换句话说:
如果您的代码已编译/部署/运行,并且测试/使用的对象实例属于您的类,那么它应该运行您的逻辑。
答案 2 :(得分:-4)
您需要在函数上方添加@Override
。
@Override
public String toString()
{
return String.format(
"%s: %s %s\n%s: %s\n%s: %.2f\n%s: %.2f\n%s: %.2f\n%s: %.2f",
"based-salaried commission employee", cEmp.getFirstName(), cEmp.getLastName(),
"social security number", cEmp.getSocialSecurityNumber(),
"gross sales", cEmp.getGrossSales(),
"commission rate", cEmp.getCommissionRate(),
"base salary",baseSalary,
"earnings", earnings());
}