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