以下是翁恺老师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()
方法。
- 当执行