RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1596060
Accepted
Mazl
Mazl
Asked:2024-10-08 18:29:05 +0000 UTC2024-10-08 18:29:05 +0000 UTC 2024-10-08 18:29:05 +0000 UTC

创建界面时如何正确使用字段?

  • 772

我有一个界面IMatrix:

public interface IMatrix {

    int[][] data = null;
    public int rows = 0;
    public int cols = 0;
        
    int getElement(int row, int column);
    void setElement(int row, int column, int value);
        
    IMatrix sum(IMatrix m1, IMatrix m2);
    IMatrix product(IMatrix other);
        
    boolean equals(IMatrix other);
    String toString();
        
}

例如,下面是一个sum()我想在每个类中以不同方式实现的方法,但是当访问 fields 时rows,colsEclipse 会抛出警告:

静态字段 IMatrix.cols 应该以静态方式访问

我不太明白如何在实现接口的类中正确实现方法。

以下是我尝试在类中实现此方法的UsualMatrix方法IMatrix:

@Override
public IMatrix sum(IMatrix m1, IMatrix m2) {
            
    if ((m1.rows != m2.rows) || (m1.cols != m2.cols)) {
        throw new MatrixOperationException("Matrices must be the same size to be added together.");
    }
            
    UsualMatrix mtxFinal = new UsualMatrix(rows, cols);
            
    for (int i = 0; i < this.rows; i++) {
        for (int j = 0; j < this.cols; j++) {
            mtxFinal.data[i][j] = m1.data[i][j] + m2.data[i][j];
        }
    }
            
    return mtxFinal;
}
java
  • 2 2 个回答
  • 120 Views

2 个回答

  • Voted
  1. Best Answer
    Nowhere Man
    2024-10-09T06:44:01Z2024-10-09T06:44:01Z

    由于主要问题已经提出:创建界面时如何正确使用字段?,答案可能是:

    • 接口描述了某个对象的行为,也就是说,经典接口归结为指定方法签名
    • (实例)字段定义该对象的状态参数,在创建接口时根本不能使用它们。

    前面的答案指出,接口中的“字段”是静态的(即,它们适用于实现给定接口的所有实例),但即使省略相应的修饰符,它们也是最终的(常量)final。

    在接口中定义它们并为它们分配一些初始值是没有意义的 - 对于所有IMatrix实现,的实例data将始终分别等于,null和0,并且这是无法更改的。rowscols

    事实上,在方法的实现中只出现了 Eclipse 的警告,sum这仅意味着类中要么编写了存根而不是构造函数,要么UsualMatrix已经添加了类似的实例字段,否则在尝试分配时会出现编译错误最终变量的值:

    // class UsualMatrix
    // поля экземпляра
    private int rows, cols; // без этого объявления была бы попытка изменить константы в интерфейсе
    private int[][] data;   // аналогично 
    
    public UsualMatrix(int r, int c) {
        this.rows = r;
        this.cols = c;
        this.data = new int[rows][cols];
    }
    

    不幸的是,Java 在声明静态变量和实例变量时允许类似的同音异义词。

    接下来我们看看该方法的实现sum。

    NullPointerException显然,当尝试执行此方法时,尝试直接访问变量datafor 变量m1( ) 时会抛出异常:m2

    mtxFinal.data[i][j] = m1.data[i][j] + m2.data[i][j]; // m1.data и m2.data - null! 
    

    因为它们是用一种类型声明的IMatrix,在该类型的上下文中只有一个静态常量data等于null!


    基于上述,为了“正确”使用字段,它们应该从接口中完全删除IMatrix,例如,移动到某个基(抽象)类,如 @talex 和 @RomanC 之前的答案所示,并且仅矩阵大小的 getter 应该留在接口和读取/写入元素的方法中。

    在同一个基/抽象类中,应分别实现类方法Object equals(以便正确调用重载版本equals(IMatrix that))hashCode和/或toString。

    矩阵运算的方法可以放置在一个单独的类中,该类封装了处理矩阵的算法。

    实施示例:

    public interface IMatrix {
        int rows();
        int cols();
    
        int getElement(int row, int column);
        void setElement(int row, int column, int value);
    }
    

    如果需要,您可以实现构造函数来复制原始数组或简单地分配对数组的引用等。

    public class UsualMatrix implements IMatrix {
        private final int rows, cols;
        private final int[][] data;
    
        public UsualMatrix(int rows, int cols) {
            this.rows = rows;
            this.cols = cols;
            this.data = new int[rows][cols];
        }
    
        @Override public int rows() { return this.rows; }
        @Override public int cols() { return this.cols; }
    
        @Override public int getElement(int row, int column) {
            return this.data[row][column];
        }
        @Override public void setElement(int row, int column, int value) {
            this.data[row][column] = value;
        }
    
        // TODO
        // @Override public boolean equals(Object o) {...}
        // @Override public int hashCode() {...} // вместе с equals
        // @Override public String toString() {...}
    }
    

    在这种矩阵处理算法的实现中,仅使用了相应的接口方法IMatrix,而没有“直接”访问实例字段。

    public class IMatrixOperations {
        public static IMatrix sum(IMatrix mx1, IMatrix mx2) {
            int r = mx1.rows();
            int c = mx1.cols();
            if((r != mx2.rows()) || (c != mx2.cols())) {
                throw new IllegalArgumentException("Matrices must be the same size to be added together.");
            }
    
            IMatrix result = new UsualMatrix(r, c);
            for (int i = 0; i < r; i++) {
                for (int j = 0; j < c; j++) {
                    result.setElement(i, j, mx1.getElement(i, j) + mx2.getElement(i, j));
                }
            }
            
            return result;
        }
        //....
    }
    
    • 3
  2. talex moved to Codidact
    2024-10-08T21:43:21Z2024-10-08T21:43:21Z

    接口字段始终是静态的。你需要一个抽象类。

    • 1

相关问题

  • wpcap 找不到指定的模块

  • 如何以编程方式从桌面应用程序打开 HTML 页面?

  • Android Studio 中的 R.java 文件在哪里?

  • HashMap 初始化

  • 如何使用 lambda 表达式通过增加与原点的距离来对点进行排序?

  • 最大化窗口时如何调整元素大小?

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5