Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java继承和访问修饰符_Java_Inheritance_Protected_Access Modifiers - Fatal编程技术网

Java继承和访问修饰符

Java继承和访问修饰符,java,inheritance,protected,access-modifiers,Java,Inheritance,Protected,Access Modifiers,我正在尝试创建一个类系统,如下所示: public class Matrix { private int[][] m; public Matrix(int rows, int cols) { //constructor } public int get(int row, int col) { return m[row][col]; } } public class Vector extends Matrix { p

我正在尝试创建一个类系统,如下所示:

public class Matrix {
    private int[][] m;
    public Matrix(int rows, int cols) {
        //constructor
    }
    public int get(int row, int col) {
        return m[row][col];
    }
}

public class Vector extends Matrix {
    public Vector() {
        //constructor
    }
    public int get(int index) {
        return super.get(0, index);
    }
}
我希望Matrix.get(row,col)函数是公共的,但我不希望它通过Vector类是公共的。我不希望这成为可能:

Vector v = new Vector();
int x = v.get(1, 1);
私有访问修饰符对我没有帮助,因为它不能使方法在Matrix类之外可用(除了它的继承者)


关于如何实现它有什么想法吗?

不幸的是,这是不可能的,因为如果一个类继承了另一个类,则必须能够调用继承的类的所有方法

如果您不想这样做,因为索引将超出范围,那么将
getRows()
getColumns()
方法添加到矩阵中,任何拥有向量实例的人都将检查以确保在调用
get(int row,int col)时
它不会抛出索引越界异常。

怎么样

public class Vector extends Matrix {
  public Vector(int cols) {
    super(0, cols);
  }

  public int get(int index) {
    return get(0, index);
  }

  @Override
  public int get(int row, int col) {
    if (row > 0) {throw new IllegalArgumentException("row != 0");
    return super.get(0, index);
  }
}

在这种情况下,您可以考虑使用组合而不是继承 Vector类将成为:

  public class Vector {
    private Matrix matrix;
    public Vector() {
      matrix = new Matrix();
    }
    public int get(int index) {
      return matrix.get(0, index);
    }
  }
另一个解决方案是反转继承:

 public class Matrix  extends Vector{
    private int[][] m;
    public Matrix(int rows, int cols) {
      super(0);
    }
    public int get(int row, int col) {
      return m[row][col];
    }

    @Override
    public int get(int index) {
      return m[0][index];
    }
  }

  public class Vector {
    private int[] v;

    public Vector(int length) {
      v = new int[length];
    }
    public int get(int index) {
      return v[index];
    }
  }

在这种情况下,
向量
不应该扩展
矩阵
。你为什么想要实现这样的目标?听起来像是一个。受保护;)怎么样。试试看,这是不可能的。但是您可以做一件事,您可以覆盖
Vector
类中的get方法并弃用它
@Override@Deprecated/***不要使用方法*/public int-get(int-row,int-col){return-1;}
@Sagiv您能告诉我们您不希望
Vector
的对象看不到父对象的
get
方法的原因吗?我的意思是,您试图解决的具体问题是什么?您可以尝试更改包结构并使用默认访问修饰符。