从main中隐式调用类中的方法

时间:2017-12-09 11:11:55

标签: java class methods main

我是Java新手,我正在尝试解决我教授给出的练习。 他给了这堂课

public class MioPunto {
public int x;
public int y;
public String toString() {
    return ("[" + x + "," + y + "]");
  }
}

我应该用main方法编写另一个类。进入主要我必须打印坐标而不显式调用" toString"方法。 我不自觉地用这种方式解决了它

public class TestMioPunto{
public static void main(String[] args){
    MioPunto inizio = new MioPunto();
    MioPunto fine = new MioPunto();
    inizio.x=10;
    inizio.y=10;
    fine.x=20;
    fine.y=30;
    System.out.println("Inizio: " + inizio + "\n" + "Fine: " + fine);
  }
}

,输出为enter image description here 我无法理解Java如何自动调用toString方法(括号和逗号),你能解释一下吗?

2 个答案:

答案 0 :(得分:2)

当您在toString和对象上使用+时,Java会调用String

所以你的

System.out.println("Inizio: " + inizio + "\n" + "Fine: " + fine);

相同
System.out.println("Inizio: " + inizio.toString() + "\n" + "Fine: " + fine.toString());

除了,如果iniziofinenull,则第一个不会给您错误(您会看到null而在字符串中),但第二个将。

来自JLS关于the String Concatenation operator的部分:

  

如果只有一个操作数表达式是String类型,则在另一个操作数上执行字符串转换(第5.1.11节)以在运行时生成字符串。

引用String Conversion section,它说(在讨论将原语转换为字符串之后):

  

...

     

现在只需要考虑参考值:

     
      
  • 如果引用为null,则将其转换为字符串“null”(四个ASCII字符n,u,l,l)。

  •   
  • 否则,转换的执行就好像通过调用没有参数的引用对象的toString方法一样;但是如果调用toString方法的结果为null,则使用字符串“null”。

  •   

答案 1 :(得分:1)

由于java.lang.ObjectMioPunto的隐式基类(因为它是所有Java对象的基类),因此方法MioPunto.toString()覆盖 Object.toString()方法。

由于所有对象都具有toString()的实现,因此Java编译器可以在使用toString()运算符执行的字符串连接链中的任何对象上自由添加+的调用:

  

字符串连接运算符+(第15.18.1节),当给定String操作数和引用时,将通过调用{{}将引用转换为String 1}}引用对象的方法(如果toString的引用或结果是"null"引用,则使用toString),然后生成新创建的null这是两个字符串的串联。