Java 为什么我的toString()类会被自动覆盖?

Java 为什么我的toString()类会被自动覆盖?,java,overriding,Java,Overriding,我正在使用Eclipse构建id:20120614-1722 我有一个名为“TOY1”的对象类和一个函数toString()。我以前知道当我打电话给 System.out.println(TOY1); 它应该返回地址。但是,出于某种原因,它返回为我的对象声明的toString(),而我没有指定@Override符号 这样保存安全吗?或者这是我在特定构建中实现的新特性 谢谢 编辑 正如所问,这是我代码的一部分: public class TOY1 { //irrelevant declara

我正在使用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_实例,然后使用
System.out.printIn(TOY1_实例)打印时

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


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

@override
注释只是可选的

代码在使用和不使用它时都是一样的

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


正如Tamasz所提到的-不可能用@Override方法来注释实际上没有重写任何内容的方法。所以它有时可以帮你省钱。

@Override
注释只是可选的

代码在使用和不使用它时都是一样的

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


正如Tamasz所提到的-不可能用@Override方法来注释实际上没有重写任何内容的方法。所以它有时可以节省您的时间。

System.out.println(obj)
正在内部调用
obj.toString()
。如果不重写它,
toString()
的默认实现会返回一些类似于地址的值

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

@Override
public String tostring() //...
不会编译。更常见的错误是错误的
equals()


你明白为什么吗?如果没有
@覆盖
,很容易错过如此巨大的错误。

System.out.println(obj)
正在内部调用
obj.toString()
。如果不重写它,
toString()
的默认实现会返回一些类似于地址的值

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

@Override
public String tostring() //...
不会编译。更常见的错误是错误的
equals()


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

即使未指定@Override,它也会始终运行最接近的toString()实例方法。为了安全起见,或者为了快速有效地编译,您应该在顶部包含@Override,即使未指定@Override,它也将始终运行最接近的toString()实例方法。为了安全起见,或者为了快速有效地编译,您应该在顶部包含@Override,Override注释只适用于编译器,JVM并不关心它

请参见此处的
覆盖
注释的定义:

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

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

@Override
注释只用于编译器,JVM并不关心它

请参见此处的
覆盖
注释的定义:

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

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

好的,让我澄清一下。因此,仍然会调用过度使用的函数,但问题是为什么即使未使用@override也会调用它?如果是这种情况,那么这个注释只是让编译器检查您是否实际重写了这个函数。它不应影响程序本身的逻辑。另外,如果你想知道具体的答案,请发代码。

好的,让我说清楚。因此,仍然会调用过度使用的函数,但问题是为什么即使未使用@override也会调用它?如果是这种情况,那么这个注释只是让编译器检查您是否实际重写了这个函数。它不应影响程序本身的逻辑。另外,如果您想要具体的答案,请发布代码。

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


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


“如果不重写toString()的默认实现,它会返回一些类似地址的值。”这是真的,我希望看到类似地址的值,因为我没有重写toString()函数。然而,我收到的输出是正确的。有什么特别的原因吗?@Syntax\u Error:显然你已经覆盖了它
@Override
注释是不相关的,它只是用于记录和一些静态分析。也许您扩展的某个类会覆盖它?@Syntax\u错误如果您有一个名为
toString
的函数,它是
public
并返回
String
,那么您确实覆盖了它。注释只是可选的。“方法代码及其签名才是最重要的。@托马斯努尔基维茨:我想丹图奇提到的可能就是我的情况。我附加了上面的代码,我没有扩展任何类,但toString是公共的。@语法\u错误:再次,您正在重写
toString()
@Override
注释是在Java 5中添加的,即使您没有用它注释overriding方法,