Java语言中有一些与字符串相关的类,例如String和StringBuffer,它们可以仅使用对象的名称加载
是这样的:
public static void main(String[] args) {
StringBuffer msg = new StringBuffer("Hello JAVA");
printMsg(msg);
}
public static void printMsg(StringBuffer msg) {
msg.append("I like JAVA");
System.out.println("printMsg: " + msg);
}
但是,其他类和自定义类不足以表示对象的名称
因此,在加载值时,您必须编写:
public class IntReference {
private int a;
public void setA(int a) {
this.a=a;
}
public int getA() {
return a;
}
public void add(int y) {
a+=y;
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
IntReference intref = new IntReference();
int a=10;
intref.setA(a);
System.out.println(intref.getA());
plus(intref);
System.out.println(intref.getA());
}
public static void plus(IntReference intref) {
intref.add(10);
System.out.println(intref.getA());
}
那么String和StringBuffer类如何仅通过名称获得其值?
它使用什么机制?
答案 0 :(得分:2)
将对象传递给println
的{{1}}方法时,将调用System.out
类中声明的toString
方法。只是为了使Object
能够确定要打印的内容。
在System.out.println
中定义toString
方法的方式不是很有帮助-它打印出一堆通常与对象的存储位置有关的字符,而不是与内容有关的字符。 / p>
但是,某些类(包括Object
)具有自己的StringBuffer
版本,该版本会覆盖toString
中的实现。因此,如果您调用Object
并将其传递给System.out.println
,则实际上会看到缓冲区的内容,而不是如果从StringBuffer
版本获得的字符toString
类被调用。
您的Object
类没有自己的IntReference
方法,因此当您将toString
对象传递给IntReference
时,{{1} {1}}类被调用。那不是很有用,这就是为什么您使用类似System.out.println
之类的原因。
答案 1 :(得分:0)
String
表示固定长度的不可变字符序列,而StringBuffer
表示可增长和可写的字符序列。
StringBuffer
的字符和子字符串可以插入中间或附加到末尾。它会自动增长以为这些添加腾出空间,并且通常会预先分配比实际需要更多的字符,以留出增长空间。
StringBuffer(String str)
:它接受String参数,该参数设置StringBuffer对象的初始内容,并为另外16个字符保留空间而无需重新分配。
有关更多基础知识,请参见以下链接:https://www.tutorialspoint.com/java/lang/java_lang_stringbuffer.htm