1

我正在使用 Eclipse 构建 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_instance 然后使用System.out.printIn(TOY1_instance)

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

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

4

6 回答 6

7

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

您可以省略@Override注释,但使用它更安全当您认为自己正在覆盖而您不是因为签名的微小差异时,它变得特别有用。例如:

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

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

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

你明白为什么吗?没有@Override它很容易错过这样一个巨大的错误。

于 2012-10-22T18:38:59.727 回答
2

@Override注释只是可选的,

无论有没有它,代码都一样。

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

正如 Tamasz 所提到的 - 不可能用实际上没有覆盖任何东西的 @Override 方法进行注释。所以它有时可以拯救你。

于 2012-10-22T18:37:54.707 回答
1

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

于 2012-10-22T18:39:43.083 回答
0

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

请参考这个网址

于 2012-10-22T18:43:51.767 回答
0

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

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

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

正如您在声明中看到的那样,它只保留在源代码中而不是类文件中。

于 2012-10-22T18:39:48.497 回答
0

好的,让我说清楚。因此,您的覆盖函数仍然被调用,但问题是为什么即使不使用 @override 也会调用它?如果是这样的话,那么这个注解只是让编译器检查你是否真的覆盖了这个函数。它不应该影响程序的逻辑。另外,如果您需要具体答案,请发布代码。

于 2012-10-22T18:42:56.577 回答