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 继承和访问修饰符的主要内容,如果未能解决你的问题,请参考以下文章

Java 继承和访问修饰符

Java_修饰符详解

java修饰符的作用范围

Java中的构造函数是不是有访问修饰符继承?

Java继承和访问修饰符

Android的java基本知识总结入门篇