以下是翁恺老师3.3.1集合容器的示范代码:
class Value{ private int i; public void set(int i){this.i=i;}public int get(){return i;}public String toString(){return ""+i; } //注意这句的有无
}public class NoteBook {public static void main(String[] args) {Value v=new Value();v.set(10);System.out.println(v);}
}
public String toString(){return ""+i; };
有这句代码时输出10,没有这句时输出notebook.Value@2d554825
解释:
-
默认的
toString()方法:- 在Java中,所有类都是
Object类的子类,Object类提供了一个toString()方法。 Object类的默认toString()方法返回的是类的名字和对象的哈希码(对象的内存地址的哈希表示)。例如:notebook.Value@2d554825。
- 在Java中,所有类都是
-
重写
toString()方法:- 在类
Value中重写了toString()方法,返回成员变量i的字符串表示。 - 这样,当调用
System.out.println(v)时,会调用v对象的toString()方法,输出i的值。
- 在类
toString()方法
System.out.println(v) 实际上调用了 v.toString() 方法
在 Java 中,println 方法被设计为处理各种类型的参数,包括对象。为了将对象转换为字符串,println 方法会调用对象的 toString() 方法。具体来说,以下是工作原理的详细解释:
-
println方法的重载:System.out.println方法有多个重载版本,可以处理不同类型的参数,包括int、float、char、String、boolean、对象等等。- 当
println方法接收到一个对象作为参数时,它实际上调用的是接受Object类型参数的版本。
-
Object的toString()方法:- 在
println方法中,若参数是一个对象(例如v),Java 会自动调用该对象的toString()方法。 toString()方法是Object类中的一个方法,所有类都继承了Object类,因此每个类都有toString()方法。- 如果没有在自定义类中重写
toString()方法,则会调用Object类中的默认实现,返回类名和对象的哈希码。
- 在
-
具体的调用过程:
- 当执行
System.out.println(v)时,Java 实际上执行了System.out.println(v.toString())。 - 如果
v的类中重写了toString()方法,则调用重写的方法;否则,调用默认的Object.toString()方法。
- 当执行