3

我在许多网站上进行了搜索,根据他们的回答是否定的,为什么 Java 中的这个 prog 在没有点运算符的情况下调用这个方法?

class A
{

    public String toString()
    {
          return "Hello";
    }

    public static void main(String ar[])
    {
          A a=new A();
          System.out.println(a);  
    }
}
4

4 回答 4

5

您已经覆盖toStringObject. 所有 Java 类都隐式扩展Object.

阅读文档,尽管这与您的问题有点无关。见下文为什么。


您可能想查看 System.out.println(java.lang.Object) 行为方式。

打印一个对象,然后终止该行。这个方法首先调用 String.valueOf(x) 来获取打印对象的字符串值,然后表现得好像它调用了 print(String) 和 println()。


从那里,你会想知道是什么String.valueOf(java.lang.Object)

返回
如果参数为空,则字符串等于“null”;否则,返回 obj.toString() 的值。

于 2013-09-07T13:32:47.800 回答
3

println方法内部,它将这个写入输出流:

a == null ? "null" : a.toString()
于 2013-09-07T13:35:44.533 回答
0

假设您正在询问如何在没有“。”的情况下调用方法。因为在这种情况下a.toString()隐式调用

这种行为有点类似于:

Class A{
  void doSomething(){}

  void doAnother(){
  //both are leagal 
   doSomething();    //implicitly this.doSomething()
   this.doSomething();
  }

}
于 2013-09-07T13:32:37.420 回答
0

当您在任何对象引用上调用 sysout 时,将调用 toString 方法

 System.out.println(a); 

由于您已将此方法重写为 return hello,因此我们的程序会打印 hello 而不调用任何点运算符。

于 2013-09-07T14:02:04.387 回答