繁体   English   中英

Java_为什么打印成员变量给出实际值?

[英]Java_why print member variable give actual value?

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);
    }
}
  • 这是一个简单的问题,我们都知道输出,但有一个问题
  • 请参阅上面的代码和此处的图片传递值

  • 问题:

    1. 如果我打印出这样一个对象的引用: System.out.println(c); ,IDE 会为我生成一个内存地址: Customer@60e53b93
    2. 但是,在视频教程中(截图,见图片链接传递值 在此处输入图片说明

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

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

   public final static PrintStream out = null;

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

   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 类中 ValueOf() 方法的实现如下:-

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

2.String 类重写了对象类的 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类的 toString 方法。 就是这样,您将获得Customer@60e53b93作为输出。 在此处输入图片说明

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

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

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

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

 public void println(Object x)

打印一个Object ,然后终止该行。 此方法首先调用String.valueOf(x)以获取打印对象的字符串值,然后其行为就像调用print(String)println()

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

当您调用println(c.name)name是一个String变量,这将调用以String作为参数的println()方法:

System.out.println(c.name);

文档中

打印

public void println(String x)

打印一个String ,然后终止该行。 这个方法的行为就像它先调用print(String)然后调用println()

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

也参考这些: q1这个 q2

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM