Java数学库开发疑问:getMatrix()为何返回引用而非数组值
问题分析与解决方案:Java数组打印显示引用而非内容
嘿,我来帮你理清这个问题!首先得明确一点:你的getMatrix()方法确实返回了二维数组对象,但你看到的[[I@15db9742并不是“返回了引用”,而是Java数组默认的toString()方法输出结果。
为什么会出现[[I@15db9742?
在Java中,数组属于引用类型,当你直接打印一个数组对象时,它会调用继承自Object类的toString()方法,这个方法的默认实现是:
public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); }
[[I表示这是一个int类型的二维数组([代表数组维度,两个[就是二维;I代表int类型)@15db9742是该数组对象的哈希码的十六进制表示
简单说:你打印的是数组对象本身,而不是它存储的内容。
如何让数组内容正确显示?
要打印二维数组的全部值,你有两种常用方法:
方法1:使用Arrays.deepToString()
Java的java.util.Arrays类提供了专门处理多维数组的格式化方法,直接调用它就能把二维数组转成可读的字符串:
import java.util.Arrays; // 修改你的main方法打印语句: public static void main(String[] args){ Mathematik.Matrix(3,3); Mathematik.setMatrix(10); System.out.println("矩阵内容:" + Arrays.deepToString(Mathematik.getMatrix())); }
这样就能输出类似[[10, 10, 10], [10, 10, 10], [10, 10, 10]]的清晰结果。
方法2:手动遍历数组拼接字符串
如果你不想依赖Arrays类,也可以自己遍历二维数组的每个元素,拼接成想要的格式:
// 在Mathematik类里新增一个方法 static String getMatrixAsString() { StringBuilder sb = new StringBuilder(); sb.append("["); for (int i = 0; i < matrix.length; i++) { sb.append("["); for (int j = 0; j < matrix[i].length; j++) { sb.append(matrix[i][j]); if (j != matrix[i].length - 1) { sb.append(", "); } } sb.append("]"); if (i != matrix.length - 1) { sb.append(", "); } } sb.append("]"); return sb.toString(); }
然后在main里调用这个方法打印即可:
System.out.println("矩阵内容:" + Mathematik.getMatrixAsString());
顺便修正你代码里的其他问题
你的代码还有几个逻辑错误,会导致矩阵初始化和填充异常:
Matrix()方法的初始化逻辑错误:
当前循环里每次new int[l][j]会覆盖之前的matrix,最后得到的是new int[2][2](因为line=3时,l最大是2,j最大是2),正确的初始化应该是直接创建line行column列的数组:static int[][] Matrix(int line, int column){ matrix = new int[line][column]; line_0 = line; column_0 = column; return matrix; }- 静态方法的调用方式错误:
Mathematik里的方法都是static的,不需要实例化对象,直接用类名调用即可(实例化后调用静态方法虽然语法允许,但不符合规范)。 setMatrix()的返回值没必要是int:
这个方法是填充矩阵,不需要返回值,可以改成void类型,代码更清晰。
内容的提问来源于stack exchange,提问作者G.Danil
相关产品推荐
相关产品推荐

