以下是代码的片段
public class Test1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
char[] a={'a','b','c',97,'a'};
System.out.println(a);
int[] a1={8,6,7};
System.out.println(a1);
Integer[] b={10,20,30};
System.out.println(b);
}
}
这是输出
abcaa
[I@239d5fe6
[Ljava.lang.Integer;@5527f4f9
我知道它必须处理toString()
方法。它已在char中重写以返回值。因此我们按预期获得了第一个输出
这是toString()
..
java.lang.Character
方法
public String toString() {
char buf[] = {value};//The value of the Character.
return String.valueOf(buf);
}
但是看看Integer还有被覆盖的toString()
方法
public String toString() {
return String.valueOf(value); //The value of the Integer.
}
那么为什么打印a1和b代码会调用Object类的默认toString()
实现,即:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
此外,由于valueOf创建了另一个Object,但它在两个重写的方法中都很常见。
答案 0 :(得分:7)
因为有一种打印字符数组的专用方法:
https://docs.oracle.com/javase/7/docs/api/java/io/PrintStream.html#println(char[])
public void println(char[] x)
打印一个字符数组,然后终止该行。这种方法 表现得好像它会调用
print(char[])
然后调用println()
。<强>参数强>:
x
- 要打印的一系列字符。
实施:
public void println(char x[]) { synchronized (this) { print(x); newLine(); } }
它与toString
类的char[]
实现无关。
答案 1 :(得分:1)
在java.io.PrintSream
课程中你已经实现了char[]
/**
* Prints an array of characters and then terminate the line. This method
* behaves as though it invokes <code>{@link #print(char[])}</code> and
* then <code>{@link #println()}</code>.
*
* @param x an array of chars to print.
*/
public void println(char x[]) {
synchronized (this) {
print(x);
newLine();
}
}
最后调用内部方法
private void write(char buf[]) {
try {
synchronized (this) {
ensureOpen();
textOut.write(buf);
textOut.flushBuffer();
charOut.flushBuffer();
if (autoFlush) {
for (int i = 0; i < buf.length; i++)
if (buf[i] == '\n')
out.flush();
}
}
}
catch (InterruptedIOException x) {
Thread.currentThread().interrupt();
}
catch (IOException x) {
trouble = true;
}
}
哪个循环包含char[]
当您调用println whith int[]
或Integer[]
时,由于没有方法在签名中包含这些数组,因此使用了Object
public void println(Object x) {
String s = String.valueOf(x);
synchronized (this) {
print(s);
newLine();
}
}
答案 2 :(得分:0)
这是因为当你打电话时:
int[] a1={8,6,7};
System.out.println(a1);
您正在呼叫Integer[].toSTring()
而不是Integer.toSTring()
您需要循环播放元素中的每个元素,或覆盖Integer[].toSTring()
以在其每个元素上调用toString()
。
如果你写的话,请亲自看看:
System.out.println(a1[0]);
System.out.println(a1[1]);
System.out.println(a1[2]);
它会打印出预期的输出。
答案 3 :(得分:0)
printStream有一个特定的方法来打印char [],但没有打印int []或其他一些数组的方法,所以当处理不是fo类型char []的数组时,你正在调用方法with Object as参数whic委托给toString()
方法,该方法不迭代单个元素。
如果您想要始终打印数组的内容,则有一个标准的api
的System.out.println(Arrays.toString(阵列));
答案 4 :(得分:0)
因为您要将这些对象转换为字符串。您应该使用java.util.Arrays的toString()方法 喜欢: &#34; Arrays.toString(A1); Arrays.toString(B)&#34;
答案 5 :(得分:-2)
因为你没有调用int的toString或Integer的toString,所以你正在调用Integer [] toString。这将创建存储在Array中的对象的文本表示,而不是存储的各个对象的值的文本表示。