Java_why打印成员变量给出实际值?

时间:2017-06-07 11:22:33

标签: java object memory memory-management heap

class Customer {
    public String name;

    public Customer(String name) {
        this.name = name;
    }
}

public class Main {
    public static void main(String[] args) {
        Customer c = new Customer("Sally");
        System.out.println(c);
        System.out.println(c.name);
    }
}
  • 这是一个简单的问题,我们都知道输出,但有一个关于它的问题
  • 请参阅上面的代码和此处的图片Passing Value

  • 问题:

    1. 如果我打印出这样的对象的引用:System.out.println(c);,IDE将为我生成一个内存地址:Customer@60e53b93
    2. 但是,在视频教程中(截图,请参见图片链接Passing Valueenter image description here

,该对象有一个成员变量,它是一个引用到一个String - > " Sally",为什么当我System.out.println(c.name)尝试打印参考(名称)时,它会给出真正的字符串对象 t ("莎莉")。 不应该打印真实对象的内存地址(" Sally")???

3 个答案:

答案 0 :(得分:4)

第一个问题答案: - 1。out是System Class中PrintStream的静态变量。    在System类中声明为

   public final static PrintStream out = null;

当你致电System.out.println((Object)c);时 在内部调用PrintStrem类的println方法。 PrintStream类中println mehtod的实现如下: -

   public void println(Object x) {
        String s = String.valueOf(x);
        synchronized (this) {
            print(s);
            newLine();
        }
    }
  public void print(Object obj) {
        write(String.valueOf(obj));
    }

通过此代码,很明显out将调用String ValueOf方法。 并在String Class中实现ValueOf()方法,如下所示: -

 public static String valueOf(Object obj) {
        return (obj == null) ? "null" : obj.toString();
    }

2.String类覆盖了Object Class的toString方法,如下所示: -

    /**
     * This object (which is already a string!) is itself returned.
     *
     * @return  the string itself.
     */
    public String toString() {
       return this;
     }

对象类中的toString()方法: -

  /**
   * Returns a string representation of the object. In general, the
   */
public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

您的班级Customer没有覆盖Object类的toString()方法,因此当您调用System.out.println(c);时,它将调用Object Class的toString方法。多数民众赞成你将获得Customer@60e53b93作为输出。enter image description here

答案 1 :(得分:2)

System.out是类PrintStream的对象。 PrintStream.println()为对象调用String.valueOf()String.ValueOf(object)调用object.toString()。 对于String,PrintStream.println()打印出字符串。对于Customer类,您默认为Object.toString()导致打印Customer @ string。

答案 2 :(得分:1)

注意:println()System类中的重载方法。当你打电话

    Customer c = new Customer("Sally");
    System.out.println(c);

这将调用将对象作为参数的println()方法。如果你参考documentation,你会看到:

public void println(Object x)
     

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

     

<强>参数:       x - 要打印的对象。

当您致电println(c.name)时,nameString变量,这将调用以println()为参数的String方法:

System.out.println(c.name);

documentation中:

  

<强>的println

public void println(String x)
     

打印String,然后终止该行。此方法表现为   虽然它会调用print(String)然后调用println()

     

参数:        x - 要打印的字符串。

另请参阅:q1this q2