【问题标题】:changing the toString Method更改 toString 方法
【发布时间】:2011-11-04 15:53:05
【问题描述】:

我最近被要求将使用继承的类重写为使用组合的类。我在重写 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 的编译或运行时错误,如果没有错误,为什么它不返回字符串值。

希望这不是一个太奇怪的问题。

【问题讨论】:

  • >"toString() 方法不会返回字符串值" 它返回的是什么?
  • 如果方法签名要返回字符串,它必须返回一些字符串,否则会出现编译时问题。我们需要更多信息来回答这个问题。
  • 你用那个public void outPut() 换成public String toString()?不太合理。
  • 我首先创建了一个包含 toString 方法的类的 Object,它的名字是 base。然后在主类中我调用了 base.toString(); 这样的方法;当我运行程序时,虽然它应该返回一个它不返回的字符串,但它运行程序时没有任何输出。
  • @smkelsey:你意识到调用 toString() 只返回一个字符串是吗?它不显示它。使用System.out.println(base);

标签: java tostring


【解决方案1】:

Object(所有 java 对象最终继承的类)定义了它自己的 toString() 方法。因此,如果您不覆盖类中的 toString() 方法,那么它将使用 Object() 中定义的方法(或您的类和 Object 之间的任何中间类)。

这就是为什么如果你不定义 toString() 方法,你不会从 javac 得到错误。

这通常会产生类似的字符串

System.out.println("o=" + new Object().toString())
o=java.lang.Object@1176e5f

【讨论】:

  • 我认为他的意思是在定义toString()方法时,他没有得到任何编译时错误,也没有任何运行时错误,但没有得到预期的结果。
【解决方案2】:

第一个问题(为什么没有编译错误)由 Matthew 回答。关于第二个:

据我了解,Java 中的实例方法是虚拟的,即在每种情况下都会调用实际对象的方法。因此,我想知道不会产生预期结果的代码:)

可能的错误:可能存在一些微不足道的接线错误。 IE。错误的使用/测试用例:例如,使用/测试了不同类的不同对象 - 与您实现的不同。或编译错误:您的代码尚未编译,测试时使用了另一个(可能是旧的)版本。或者类似的“琐碎”问题:)换句话说:

如果您的代码已编译/部署/运行并且测试/使用的对象实例属于您的类,那么它应该运行您的逻辑。

【讨论】:

  • 我错误地调用了 toString() 方法。我的印象是,通过返回一个 String 值,它会被打印出来,所以我使用了 base.toString();而不是 system.out.print(base);我觉得很愚蠢。感谢您的帮助。
【解决方案3】:

需要在函数上方加上@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());
}

【讨论】:

  • @Override 不是必需的。这只是为了您的安全。
  • @Override 只是给开发者的一个提示。它不影响该方法是否实际被覆盖。
  • @Override 不影响运行时行为,不包括它没有影响
  • 下次见到老师我就问问他。正如你所说,覆盖没有效果。
猜你喜欢
  • 2018-05-07
  • 1970-01-01
  • 2016-07-21
  • 1970-01-01
  • 2015-02-26
  • 2021-10-03
  • 1970-01-01
  • 2014-05-04
  • 1970-01-01
相关资源
最近更新 更多