Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在不覆盖的情况下打印对象字段?_Java_Arrays_Object_Reflection - Fatal编程技术网

Java 如何在不覆盖的情况下打印对象字段?

Java 如何在不覆盖的情况下打印对象字段?,java,arrays,object,reflection,Java,Arrays,Object,Reflection,我们可以使用System.out.println轻松打印数组(虽然数组在java中也是一种对象),但为什么我们不能直接打印对象而不重写toString()方法呢 例如: int array[]=new int(2); array[0]=10; System.out.println(array[0]); //it works Object obj=new Object(); System.out.println(obj); //it shows the classname and some val

我们可以使用
System.out.println
轻松打印数组(虽然数组在java中也是一种对象),但为什么我们不能直接打印对象而不重写
toString()
方法呢

例如:

int array[]=new int(2);
array[0]=10;
System.out.println(array[0]); //it works
Object obj=new Object();
System.out.println(obj); //it shows the classname and some value i don't know
class A {
    public String getValue() 
        return "my text";
    }
}

A a = new A();
system.out.println(a.getValue());
“它显示类名和一些我不知道的值”

这就是
对象
实例的打印方式,对于
对象
类的实例(即不是
对象
的子类),您不能覆盖
到字符串


对于
对象的自定义子类
,必须自行决定对象的字符串表示形式(通过重写
toString
)。Java不是为你决定的。

你希望从
对象中得到什么信息
。它拥有的主要信息是它的
名称和它的
hashCode()
,这是你在执行
System.out.println(obj)时得到的信息。这就是为什么如果我们想要打印有关
对象的一些特定信息,我们会在我们自己的类中重写
对象的
toString()
toString()
的默认行为是打印
Object
class name@hex表示的
hashCode()


PS:-数组也被视为
对象
,它们在打印时还为您提供
hashCode()
,除了
char[]
,这是因为
println(char[])
具有打印其内容的功能,而不像
int[]
byte[]
等。

您使用的打印数组示例仅打印一个int。您正在请求索引0处的值,然后将返回的int打印到控制台。您的示例相当于创建您自己的对象并打印您调用的方法的结果。例如:

int array[]=new int(2);
array[0]=10;
System.out.println(array[0]); //it works
Object obj=new Object();
System.out.println(obj); //it shows the classname and some value i don't know
class A {
    public String getValue() 
        return "my text";
    }
}

A a = new A();
system.out.println(a.getValue());
为了回答您的问题,system.out.println是一种方法,它将获取一个对象,并使用标准方法从给定对象中提取文本。若对象并没有这样做,您仍然需要创建自己的toString()等效方法,以便从对象打印出信息


如果你想让toString()打印出一个对象中包含的所有信息,那么你最终会得到一堆毫无用处的信息。

对象是java中所有其他类的超类。它包含一个方法hashCode()返回一个32位整数值,其值取决于类实例的内容。它还包含另一个方法toString(),该方法返回对象的字符串表示形式。toString()方法的默认实现返回以类名为前缀的hashcode…如下所示:
classname@hashCode

当我们将对象的引用传递给System.out.println()时,通常会打印对象的字符串表示形式。
我们可以通过覆盖实例类中的toString()方法来更改实例的字符串表示形式。

如果您正在查找第三方类实例的内容,或者您的类,但不想重写toString,您可能是出于某些调试目的而这样做的。当然,您可以在不修改任何内容的情况下执行此操作。您需要使用并定义一些静态实用程序toString方法,该方法将迭代所有字段

奇怪的是,为什么在公认的答案中忽略了这一点。您也可以在类中重写时使用此功能,第三方类的区别在于您必须显式忽略非公共访问修饰符。

看看这个已回答的问题:

该对象中还有哪些其他信息需要显示???即使有信息,JVM如何知道要显示哪些信息???是的,你是对的…我们不能在没有子类化的情况下覆盖任何类的toString。我的问题中犯了错误,但我的目标是了解为什么我们可以轻松打印数组的值(尽管在java中数组是一种对象)?通常,如果一个对象包含任何值,那么我们不能直接打印该对象的值?我是一个java新手,我可能会被错误地质疑,并为此感到抱歉……我们不能在不对任何类进行子类化的情况下重写任何类的toString(或任何其他方法)。。我们可以吗???@user2703995在您的示例中,它是基本数组中元素的值。Java处理原语类型的打印,因为您自己无法处理它(没有为原语重写的
toString
方法)。@Codebender是的,我特别提到了对象类,因为OP的代码创建了
Object
的实例。