我目前一直在学习Java,并对某段代码感到困惑。我来自C,Python背景,所以我更多地学习Java的语法和小的利基。
下面我有2节课。我的Main类和一个包含返回类的装饰输入字符串的方法的类。
我很困惑为什么调用myObject会自动调用返回消息的“toString()”方法?我不应该定义我想要在对象上调用的方法吗?为什么你能用Java做到这一点?
我认为这是因为该类被称为“OtherClass”,而OtherClass中的方法被称为“OtherClass”,但是当我用另一个类测试这个假设时,调用该对象会返回该对象及其地址位置。
任何帮助都会很棒。谢谢!
public class HelloWorld
{
public static void main(String[] args)
{
int i = 0;
OtherClass myObject = new OtherClass("Hello World!");
// This calls method toString()
System.out.print(myObject);
// This calls method toString()
System.out.print(myObject.toString());
}
}
public class OtherClass
{
private String message;
private boolean answer = false;
public OtherClass(String input)
{
message = "Why, " + input + " Isn't this something?\n";
}
public String toString()
{
return message;
}
}
答案 0 :(得分:2)
public void print(Object obj)
打印一个对象。
String.valueOf(Object)
方法生成的字符串根据平台的默认字符编码转换为字节,这些字节的写入方式与write(int)方法完全相同。
public static String valueOf(Object obj)
返回Object参数的字符串表示形式。
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
正如@Andreas在评论中所说,如果此方法未被子类覆盖,toString()
将打印哈希码:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
答案 1 :(得分:0)
这是java中的内置功能。您不需要编写.toString()
来打印有关Object的信息。
即使使用java运算符,您也可以在任何地方使用此功能:
System.out.print(myObject1 + myObject2);
与:
相同System.out.print(myObject1.toString() + myObject2.toString());
toString()
是java.lang.Object中的一个方法,因此每个对象都包含此方法。默认实现显示哈希码。您可以使用自己的实现覆盖它。
答案 2 :(得分:0)
在Java中有一个名为Object的类,您定义的任何其他类
从中继承,它有一个名为' toString'
的方法/ ** *返回对象的字符串表示形式。一般来说, * {@code toString}方法返回一个字符串 *"文字表示"这个对象。结果应该 *是一个简洁但信息丰富的表示,很容易 *有人阅读。 *建议所有子类都覆盖此方法。 *
*类{@code Object}的{@code toString}方法 *返回一个字符串,该字符串由其类的名称组成 * object是一个实例,at符号字符`{@code @}'和 *哈希码的无符号十六进制表示 *对象。换句话说,此方法返回一个等于的字符串 * 的价值: *
** * @return对象的字符串表示。 * /* getClass().getName() + '@' + Integer.toHexString(hashCode()) *
因此,您只需在调试模式下运行main方法并设置断点
在<{1}}的对象中的
toString
答案 3 :(得分:0)
如果要将任何对象表示为字符串,toString()
方法就会出现。
如果打印任何对象,java编译器会在内部调用对象上的toString()
方法。因此,重写toString()
方法,返回所需的输出,它可以是对象的状态等取决于您的实现。
答案 4 :(得分:0)
Java旨在轻松地将对象打印为字符串。
System.out是一个PrintStream(参见https://docs.oracle.com/javase/8/docs/api/java/io/PrintStream.html#print-java.lang.Object-)
将对象传递给方法print(或println)时,实际上是在调用
String.valueOf(Object)(见https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#valueOf-java.lang.Object-)
反过来会执行以下操作
“如果参数为null,则字符串等于”null“;否则, 返回obj.toString()的值。“
如果您的对象具有显式的toString()实现,则将调用此方法,否则解释器将尝试在层次结构中查找实现它的对象。
答案 5 :(得分:0)
&#34;我认为这是因为班级被称为&#34; OtherClass&#34;而OtherClass中的方法被称为&#34; OtherClass&#34;但是当我用另一个类测试这个假设时,调用该对象会返回该对象及其地址位置。&#34;
实际上,与类(例如OtherClass
)具有相同名称的方法是构造函数方法,在初始化类时将自动调用该方法。
在这种情况下,运行OtherClass myObject = new OtherClass("Hello World!");
时,构造函数方法
public OtherClass(String input)
{
message = "Why, " + input + " Isn't this something?\n";
}
调用并设置message
值。
当谈到System.out.print(myObject);
时,将调用myObject.toString()
并返回字符串message
。
所以这里的关键点是覆盖你的类中的toString()
方法,你可以通过修改toString()
方法打印你想要的任何消息,如果这个方法没有覆盖,它将返回一些关联的东西哈希码。 (只是尝试享受〜)