为何无法在Main类调用Matrix的getMinor方法?报错方法未定义
问题:调用Matrix类方法报错"The method getMinor(Matrix) is undefined for the type Main"
我编写了Java代码,但在Main类的最后一行持续报错:"The method getMinor(Matrix) is undefined for the type Main."。我可以在Main类中调用Matrix类的其他方法,但无法调用getMinor和printMinor方法,请问我哪里出错了?
Matrix类代码
import java.util.ArrayList; public class Matrix { private int n; private int m; private ArrayList<Double> Matrices = new ArrayList<Double>(); public Matrix(int n, int m) { this.n = n; this.m = m; Matrices = new ArrayList<Double>(n*m); } public void printElement(int a, int b) { int index = (a-1)*m + b - 1; double element = Matrices.get(index); System.out.println(element); } public double getElement(int a, int b) { int index = (a-1)*m + b - 1; double element = Matrices.get(index); return element; } public void printMatrix() { for(int a = 1; a <= n; a++) { System.out.print("["); for(int b = 1; b <= m; b++) { if(b == 1) { System.out.print(Matrices.get((a-1)*m + b - 1).toString()); } else { System.out.print(" " +Matrices.get((a-1)*m + b - 1).toString()); } } System.out.println("]"); } System.out.print("\n"); } public int getRowNumber() { return n; } public int getColumnNumber() { return m; } public Matrix getMinor(Matrix Matrices) { Matrix minor = new Matrix(Matrices.getRowNumber() - 1, Matrices.getColumnNumber() - 1); for(int r = 1; r <= Matrices.getRowNumber(); r++) { for(int i = 1; i <= Matrices.getColumnNumber(); i++) { minor.addTo(r, i, Matrices.getElement(r+1, i+1)); } } return minor; } public void printMinor(Matrix Matrices) { Matrix minor = getMinor(Matrices); minor.printMatrix(); } public void addTo(int a, int b, double value) { int index = (a-1)*m + b - 1; Matrices.add(index, value); } }
Main类代码
public class Main{ public static void main(String[] args) { Matrix myNew2Matrix = new Matrix(3, 3); myNew2Matrix.addTo(1,1,3); myNew2Matrix.addTo(1,2,2); myNew2Matrix.addTo(1,3,2); myNew2Matrix.addTo(2,1,1); myNew2Matrix.addTo(2,2,4); myNew2Matrix.addTo(2,3,4); myNew2Matrix.addTo(3,1,8); myNew2Matrix.addTo(3,2,2); myNew2Matrix.addTo(3,3,5); getMinor(myNew2Matrix); // 报错行 } }
问题原因及解决方法
核心错误原因
getMinor和printMinor是Matrix类的实例方法,不属于Main类。你直接在Main的main方法中调用getMinor(myNew2Matrix),相当于试图调用Main类中不存在的方法,因此报错。
修正方案
方案1:按现有代码正确调用实例方法
既然这两个方法是Matrix的实例方法,你需要通过Matrix对象来调用:
// 修改Main类的最后一行 Matrix minorMatrix = myNew2Matrix.getMinor(myNew2Matrix); // 如果要打印余子式 myNew2Matrix.printMinor(myNew2Matrix);
方案2:优化方法设计(更合理)
当前getMinor方法的设计没必要额外传入Matrix参数,因为它的作用就是求当前矩阵的余子式。可以修改方法为无参:
// 修改Matrix类中的getMinor方法 public Matrix getMinor() { // 使用当前实例的行列数 Matrix minor = new Matrix(this.n - 1, this.m - 1); // 调整循环边界,避免索引越界 for(int r = 1; r <= this.n - 1; r++) { for(int i = 1; i <= this.m - 1; i++) { minor.addTo(r, i, this.getElement(r+1, i+1)); } } return minor; } // 同步修改printMinor方法 public void printMinor() { Matrix minor = getMinor(); minor.printMatrix(); }
此时Main类中的调用会更简洁:
Matrix minorMatrix = myNew2Matrix.getMinor(); myNew2Matrix.printMinor();
额外BUG修复
你的addTo方法会触发IndexOutOfBoundsException,因为ArrayList.add(index, value)要求索引必须小于等于当前列表的大小。初始化Matrix时,只是设置了ArrayList的初始容量,实际元素数量为0。建议修改初始化逻辑和addTo方法:
// 修改Matrix构造方法 public Matrix(int n, int m) { this.n = n; this.m = m; Matrices = new ArrayList<>(n*m); // 预先填充默认值,避免索引越界 for(int i = 0; i < n*m; i++) { Matrices.add(0.0); } } // 修改addTo方法为set操作 public void addTo(int a, int b, double value) { int index = (a-1)*m + b - 1; Matrices.set(index, value); }
内容的提问来源于stack exchange,提问作者refik
相关产品推荐
相关产品推荐

