这个关键字如何在不使用的情况下调用toString()方法。操作者

时间:2018-01-05 06:31:38

标签: java

public class potpie {

    private int month;

    private int day ;

    private int year;

    public potpie(int m,int d,int y) {

        month=m;

        day=d;

        year=y;

        System.out.printf("The constructor for this is"+this);

    }
    public String toString() {

        return String.format("%d/ %d/ %d/", month,year,day);

    }

}

class apples {

    public static void main(String args[])

    {

    potpie x= new potpie(4,5,6);

    }

}

3 个答案:

答案 0 :(得分:0)

魔术位于+的{​​{1}}运算符中。使用StringString添加Object时,JVM会调用+上的toString方法,以确定Object的内容连接。

此外,String表示正在运行当前方法的实例,因此通过this运算符向this添加String,您获得+ 1}}调用当前实例。

来自Java Language Specification

  

<强> 15.18.1。 String Concatenation Operator +

     

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

and further

  

<强> 5.1.11。字符串转换

     

任何类型都可以通过字符串转换转换为String类型。

     

基本类型T的值x首先转换为引用值,就好像将它作为参数提供给适当的类实例创建表达式(第15.9节):

     
      
  • 如果T是布尔值,则使用new Boolean(x)。

  •   
  • 如果T为char,则使用新字符(x)。

  •   
  • 如果T是byte,short或int,则使用new Integer(x)。

  •   
  • 如果T很长,则使用新的Long(x)。

  •   
  • 如果T为float,则使用new Float(x)。

  •   
  • 如果T为double,则使用new Double(x)。

  •   
     

然后通过字符串转换将此引用值转换为String类型。

     

现在只需要考虑参考值:

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

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

  •   

在您的情况下,这是适用的第5.1.11节中的最后一个要点。

答案 1 :(得分:0)

这与this没有任何关系。它更多地是关于+如何使用字符串。

+运算符,当其中一个操作数是字符串而另一个不是,它将尝试将另一个操作数转换为字符串。例如:

"My age is: " + 30

它会尝试将30转换为字符串。这可以通过

来完成
"My age is: " + (new Integer(30)).toString()

情况与您的情况完全相同。你的表达:

 "The constructor for this is"+this

+的第二个操作数不是字符串,因此编译器会尝试将this转换为字符串。所以toString被称为:

"The constructor for this is"+this.toString()

toString通常是将任何引用类型转换为字符串的方式。

答案 2 :(得分:0)

如果要将任何对象表示为字符串,则toString()方法就会出现。

toString()方法返回对象的字符串表示形式。

如果打印任何对象,java编译器会在内部调用对象上的toString()方法。所以重写toString()方法,返回所需的输出,它可以是对象的状态等取决于你的实现。