java中的字符串引用

java中的字符串引用,java,string,reference,Java,String,Reference,在这段代码中,ob是测试类的引用,st是字符串类的引用。 打印ob时,它显示引用,但st打印值,即“它是一个字符串”。。为什么?因为在test类中没有重写toString(),所以它使用了Object(java中所有对象的父类)中的一个,它只会输出类名和hashcode Josh Bloch在“高效Java”中概述了这一点: (请参阅:“第9项:始终重写toString”)如果在任意对象上运行println,它将按照其方法(在对象类中定义)生成的方式打印其字符串表示,而您的类不会重写该方法。默

在这段代码中,ob是测试类的引用,st是字符串类的引用。
打印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)