为什么调用Java Object Instance执行对象的方法

时间:2016-05-24 07:15:48

标签: java class methods

我目前一直在学习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;
  }
}

6 个答案:

答案 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 @}'和        *哈希码的无符号十六进制表示        *对象。换句话说,此方法返回一个等于的字符串        * 的价值:        *

       *
     * getClass().getName() + '@' + Integer.toHexString(hashCode())
     * 
       *        * @return对象的字符串表示。        * /

因此,您只需在调试模式下运行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()方法打印你想要的任何消息,如果这个方法没有覆盖,它将返回一些关联的东西哈希码。 (只是尝试享受〜)