为什么我的toString()类被自动重写?

时间:2012-10-22 18:35:45

标签: java override

我正在使用Eclipse Build id:20120614-1722。

我有一个名为“TOY1”的对象类和一个函数toString()。我以前知道,当我打电话给

System.out.println(TOY1); 

它应该返回地址。但是,由于某种原因,它返回为我的对象声明的toString(),而没有指定@Override表示法。

保持这种方式是否安全?或者这是我在特定版本中实现的新功能。

由于

修改

据我所知,这是我的代码的一部分:

public class TOY1 {

//irrelevant declarations

public String toString() {
String data;
data="Manufacturer=";
data+=manufact;
data+="DOP:";
data+=date_of_production;
return data;
}
}

声明TOY1 TOY1 TOY1然后使用System.out.printIn(TOY1_instance)

打印出来

我得到的是实际数据而不是一些垃圾地址。

我的问题是我在哪里覆盖它没有显示警告,也没有扩展覆盖此类。

6 个答案:

答案 0 :(得分:7)

System.out.println(obj);在内部调用obj.toString()。碰巧的是toString()的默认实现,如果你不覆盖它,会返回一些类似地址的值。

您可以省略@Override注释,但更安全可以使用它。当你认为你是否压倒而你不是因为签名上的微小差别时,它变得特别有用。 E.g:

@Override
public String tostring() //...

不会编译。更常见的错误是错误equals()

@Override
public boolean equals(TOY1 obj) //...

你明白为什么吗?没有@Override,很容易错过这么大的错误。

答案 1 :(得分:2)

@Override注释只是可选的,

代码在有和没有它的情况下都是一样的。

但使用它是一个很好的品味问题。它清楚地显示了正在发生的事情 - 您从超类重新定义方法或从接口重新实现方法。

正如Tamasz所说 - 使用@Override方法注释实际上并不能覆盖任何东西是不可能的。所以它有时可以帮你省钱。

答案 2 :(得分:1)

即使未指定@Override,它也始终运行最接近的toString()实例方法。为了更安全,或者快速有效地编译,你应该在顶部包含@Override

答案 3 :(得分:0)

@Override注释仅适用于编译器,而JVM并不关心它。

请参阅此处Override注释的定义:

@Target(value=METHOD)
@Retention(value=SOURCE)
public @interface Override 

正如您在声明中所看到的,它仅保留在源文件中,而不保留在类文件中。

答案 4 :(得分:0)

好的,让我说清楚。所以,你的过度使用的函数仍然被调用,但问题是为什么即使不使用@override也会调用它?如果是这种情况,则此注释仅供编译器检查您是否实际覆盖了该函数。它不应该影响程序的逻辑。另外,如果您需要特定答案,请发布代码。

答案 5 :(得分:0)

实际上,System.out.println()可以处理几种类型的参数,其中一种是对String的引用。

Please refer this URL