我正在使用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)
我得到的是实际数据而不是一些垃圾地址。
我的问题是我在哪里覆盖它没有显示警告,也没有扩展覆盖此类。
答案 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的引用。