当前位置: 首页 > 知识库问答 >
问题:

如何在super关键字内使用单个if条件?

郎灿
2023-03-14

我正在尝试使用超级构造函数将下面的子类构造函数代码转换为一行代码。这个构造函数只需要验证2D数组在两个维度中具有相同数量的元素,并将该信息传递给超级类构造函数。我的超级类构造函数有三个参数,如下所示。我的子类构造函数只有一个数组参数。我也在这里附加我的超级类构造函数。在方阵类中,我需要实现一个表示方阵的类。我需要检查矩阵中的行数必须与列数相同。我必须扩展Matrix类来实现我的SquareMatrix类。我不应该重写Matrix类的任何方法,但我确实需要创建新的构造函数:公共SquareMatrix(双[][]array2D)抛出IllegalArgumentException我的构造函数将一个新的方阵初始化为rc by rc矩阵,其值从array2D复制。我的构造函数应该使用超类构造函数来完成所有工作。如果超类构造函数抛出异常,SquareMatrix构造函数不需要做任何事情;异常将简单地传播给调用者。

public class Matrix {
int nRows;
int nCols;
double arr[][];
public Matrix(int numRows,int numCols,double [][] array2D)throws IllegalArgumentException{
    this.nRows=numRows;
    this.nCols=numCols;

如果(nRows!=array2D.length | nCols!=array2D[0].length)抛出新的IllegalArgumentException(“维度不匹配”);其他{

        this.arr = new double[nRows][nCols];
        for(int i=0;i<this.nRows;i++) {
            for(int j=0;j<this.nCols;j++) {
                this.arr[i][j]=array2D[i][j];
            }
            
            }
        }
    } 

}公共类SquareMatrix扩展Matrix{

public SquareMatrix(double[][] array2D) throws IllegalArgumentException{
 
  if(array2D.length==array2D[0].length) {
      super(array2D.length,array2D[0].length,array2D);
  }                    

共有2个答案

毕富
2023-03-14

首先,简化。如果只需要从第三个参数中的实际数据中获取,则不需要numRows和numCols参数。

然后在基类中创建一个名为validate或类似的抽象方法。

  private abstract void validate(double[][] data) throws MatrixValidationException

然后创建一个新的异常,可以从您的validate方法中抛出,非常有创意,即MatrixValidationException。

public class MatrixValidationException extends Exception {
   public MatricValidationException(String reason) {
      super(reason);
   }
}

如果矩阵验证失败,请让您的子类validate()方法引发异常,并详细说明验证失败的原因。

private validate(double[][] data) throws MatrixValidatioException {
   if (data.length == 0) {
      throw new MatrixValidationException("No data");
   }
   if (data.length != data[0].length) {
      throw new MatrixValidationException("Matrix is not square.");
   }
}

将“抛出MatrixValidationException”添加到您的构造函数

public Matrix(double[][] data) throws MatrixValidationException {
   validate(data);
   arr = data;
}

public SquareMatrix(double[][]data) throws MatrixValidationException {
    super(data);
}
彭鸿彩
2023-03-14

诀窍是简单地安排超级调用可以在子类构造函数的第一行。

public SquareMatrix(double[][] array2D){
  super(check(array2D), check(array2D), array2D);
}

private static int check(double[][] array2D) {
  if (array2D.length != array2D[0].length)
    throw new IllegalArgumentException("unsquare");
  return array2D.length;
} 

由于似乎没有其他方法可以正确构造类,因此引发了异常。它是“正方形或半身像”。

是的,我们做了两次同样的计算。我认为不值得为节省这么一点而努力。

但是,对于这种情况,似乎有一个更简单的解决方案:

public SquareMatrix(double[][] array2D){
  super(array2D.length, array2D[0].length, array2D);
  if (array2D.length != arrary2D[0].length)
    throw new IllegalArgumentException("unsquare");
}

没有理由必须首先检查合法性。

最后,检查有缺陷。它不能筛选出参差不齐的阵列。没有任何东西可以阻止array2D[0]。长度!=阵列2D[1]。长度。

 类似资料:
  • 主要内容:super调用父类构造方法,super访问父类成员,super和this的区别由于子类不能继承父类的构造方法,因此,如果要调用父类的构造方法,可以使用 super 关键字。super 可以用来访问父类的构造方法、普通方法和属性。 super 关键字的功能: 在子类的构造方法中显式的调用父类构造方法 访问父类的成员方法和变量。 super调用父类构造方法 super 关键字可以在子类的构造方法中显式地调用父类的构造方法,基本格式如下: 其中,parameter-list 指定

  • 我对java中的super关键字有一个问题。请遵循以下示例: 我的观点是,当我在子类中使用Super()时,java如何知道在我的子类中调用哪个构造函数?因为在我的超类中,我有两个没有参数的构造函数;公共双getRadius()和公共双getArea()

  • 本文向大家介绍super 关键字的理解相关面试题,主要包含被问及super 关键字的理解时的应答技巧和注意事项,需要的朋友参考一下 super 关键字 super关键字用于从子类访问父类的变量和方法。 例如: 在上面的例子中,Sub 类访问父类成员变量 number 并调用其其父类 Super 的 方法。 使用 this 和 super 要注意的问题: 在构造器中使用 调用父类中的其他构造方法时,

  • 问题内容: 为什么我只能使用通配符而不使用类型参数? 例如,在界面中,为什么方法不是这样写的 问题答案: super绑定命名类型参数(例如)而不是通配符(例如)是非法的,这仅仅是因为即使允许,它也不会执行你希望的操作,因为既然这是所有引用类型的最终值,一切是,实际上有没有约束。 在你的特定示例中,由于任何引用类型的数组都是(通过Java数组协方差),因此可以在编译时用作(如果这样的绑定是合法的)自

  • 本文向大家介绍java 关键字super详解及用法,包括了java 关键字super详解及用法的使用技巧和注意事项,需要的朋友参考一下 java 关键字super详解 一、super关键字     在JAVA类中使用super来引用父类的成分,用this来引用当前对象,如果一个类从另外一个类继承,我们new这个子类的实例对象的时候,这个子类对象里面会有一个父类对象。怎么去引用里面的父类对象呢?使用

  • 问题内容: 可以说我有这个: 现在。如果bool1被评估为false,那么Java是否足够聪明来跳过检查bool2和bool2?Java甚至从左到右检查它们吗?我之所以这样问,是因为我在整理条件时将其内部条件“分类”(从左侧最便宜的条件开始)。现在我不确定这是否会给我带来任何性能上的好处,因为我不知道Java如何处理这个问题。 问题答案: 是的,Java(类似于其他主流语言)使用 惰性评估 短路,