Java 继承和访问修饰符
Posted
技术标签:
【中文标题】Java 继承和访问修饰符【英文标题】:Java inheritance and access modifiers 【发布时间】:2017-08-17 20:14:43 【问题描述】:我正在尝试创建一个这样的类系统:
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 类之外可用(其继承者除外)
关于如何实现的任何想法?
【问题讨论】:
在这种情况下,Vector
不应扩展 Matrix
。为什么要实现这样的目标?听起来像XY problem。
受保护怎么样 ;)。试试看
不可能。但是您可以做一件事,您可以覆盖 Vector
类中的 get 方法并弃用它。 @Override @Deprecated /** * do not use method */ public int get(int row, int col) return -1;
@Sagiv 您能告诉我们您不希望Vector
的对象看不到父级的get
方法的原因是什么吗?我的意思是您要解决的具体问题是什么?
您可以尝试更改包结构并使用默认访问修饰符。
【参考方案1】:
在这种情况下,您可以考虑使用组合而不是继承 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];
【讨论】:
【参考方案2】:怎么样
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);
?
【讨论】:
【参考方案3】:不幸的是,这是不可能的,因为如果一个类继承另一个类,您必须能够调用所继承类的所有方法。
如果由于索引超出范围而不想执行此操作,请向矩阵添加 getRows()
和 getColumns()
方法,任何拥有 Vector 实例的人都会检查确定当他们调用get(int row, int col)
时,它不会抛出索引越界异常。
【讨论】:
以上是关于Java 继承和访问修饰符的主要内容,如果未能解决你的问题,请参考以下文章