java中的字符串引用
在这段代码中,ob是测试类的引用,st是字符串类的引用。java中的字符串引用,java,string,reference,Java,String,Reference,在这段代码中,ob是测试类的引用,st是字符串类的引用。 打印ob时,它显示引用,但st打印值,即“它是一个字符串”。。为什么?因为在test类中没有重写toString(),所以它使用了Object(java中所有对象的父类)中的一个,它只会输出类名和hashcode Josh Bloch在“高效Java”中概述了这一点: (请参阅:“第9项:始终重写toString”)如果在任意对象上运行println,它将按照其方法(在对象类中定义)生成的方式打印其字符串表示,而您的类不会重写该方法。默
打印ob时,它显示引用,但st打印值,即“它是一个字符串”。。为什么?因为在
test
类中没有重写toString()
,所以它使用了Object
(java中所有对象的父类)中的一个,它只会输出类名和hashcode
Josh Bloch在“高效Java”中概述了这一点:
(请参阅:“第9项:始终重写toString”)如果在任意对象上运行
println
,它将按照其方法(在对象
类中定义)生成的方式打印其字符串表示,而您的类不会重写该方法。默认实现打印引用(或类似的内容)。因为string类重写了对象的方法toString
,该方法应该打印传递给构造函数的内容。但是test类不这样做。您的测试
类不会重写toString
,但是字符串
会重写。从类名构造一个字符串,调用print on Java对象的hashCode
只调用从对象类默认继承的toString()方法。由于String类具有toString()的重写行为来打印字符串值,而您的测试类没有这样的实现,因此存在差异。在对象中有一个方法toString()
。
返回对象的字符串表示形式。通常,toString方法返回一个“文本表示”此对象的字符串。结果应该是一个简洁但信息丰富的表示,便于一个人阅读。建议所有子类重写此方法。
所以你可以重写这个方法,做你想做的事。。。因此String类也会重写这个方法并返回String而不是Object的Hashcode..这是因为Java支持将字符串表示为文本,编译器支持将字符串文本自动转换为字符串对象;以及使用Object.toString方法将任何引用类型(即类对象的任何子类)自动转换为可打印字符串
在您的示例中,Java编译器注意到对print语句的方法调用的签名是System.out.toString(字符串arg)。因此,它知道必须将参数转换为字符串。每个Java类都会自动扩展对象类,即使您没有显式声明它,对象
类包含一个toStrong()
方法,该方法用于获取表示对象
类实例的字符串。Object
类的toString()
方法用于显示对象的引用,但该引用不是实际引用(它只是一个包含引用信息的文本)
但是,此方法可能会被其子类覆盖,这就是字符串
类的情况。String
类的toString()
方法被重写,以表示String
对象持有的内容
现在,当您在对象上使用print
或println
方法时,它调用对象的toString()
方法并打印这些值
在您的例子中,test
类没有重写toString()
方法,因此它会打印出对象.toString()给出的任何值。String是java中的一个特殊类,您可以在其中保存数据字符串
默认情况下,每个类都扩展java.lang.Object,您可以重写ToString方法以显示类中的数据
因为您没有重写toString,所以它会打印引用
另一方面,String类提供了toString()的实现{
返回此;///它将打印字符串的内容。
}通过一个示例,您将看到非常清楚的信息:
class test
{
public static void main(String args[])
{
test ob=new test();
String st=new String("it is a string");
System.out.println(ob);
System.out.println(st);
}
}
并导致:
class test {
@Override
public String toString() {
return "test={no attributes to print}";
}
public static void main(String args[]) {
test ob = new test();
String st = new String("it is a string");
System.out.println(ob);
System.out.println(st);
}
}
test={no attributes to print}
it is a string
BUILD SUCCESSFUL (total time: 3 seconds)