隐藏子类中的方法

时间:2014-10-07 13:02:19

标签: java inheritance methods method-hiding member-hiding

我有一个带有一些实现方法的抽象超类。

是否可以在继承自此超类的子类中隐藏此超类中的方法?我不想在某些子类中从超类中看到一些方法。最后但并非最不重要的是,是否可以更改子类中超类中具有相同名称的方法的参数数量?

假设我们在超类中有一个方法public void test(int a, int b),但现在我想在子类中调用超类函数的方法public void test(int a),而超级类中的方法不再可见。

4 个答案:

答案 0 :(得分:4)

  

是否可以在继承自此超类的子类中隐藏此超类中的方法?

如果在超类中将方法设为私有,则它在子类(或其他任何一个)中不可见。

如果你需要基类中的方法是公共的,那么就没有办法将它隐藏在子类中,例如用私有实现覆盖它。 (你不能“降低可见性”,即在子类中从例如public或protected转到private。)

最好的解决方法可能是覆盖方法并抛出运行时异常,例如UnsupportedOperationException

  

是否可以更改超类中具有相同名称的子类中方法的参数数量?

不,您无法更改签名。您可以使用相同的名称和不同数量的参数创建另一个方法,但这将是一个不同的(重载)方法,并且基类中的方法仍然可见。

答案 1 :(得分:1)

你不能完全隐藏超类中的方法,它总是可以调用,例如

  MyBase o = new MyClass();
  o.test(1, 2);

但是,您可以以特定方式覆盖该方法:

class MySuper {
  public void test(int a, int b) {; }
}

class MyClass extends MySuper {
  @Deprecated
  @Override
  public void test(int a, int b) {
    throw new UnsupportedOperationException("Do not call this method, call test(int a) instead!");
  }

  public void test(int a) { ; }
}

答案 2 :(得分:1)

不,你不能隐藏孩子的公共方法,例如将方法设为私有。

原因是拥有子类的实例,您可以始终将其转换为基类,并在那里调用该方法。

所以这种行为是合乎逻辑的。重新设计类层次结构或创建一个新类,如果这变得太丑陋的API。

然而,您可以覆盖该方法和

/**
 * Use <code>test(a)</code> instead.
 * @param a.
 * @param b.
 */
@Deprecated
@Override
public void test(int a, int b) {
    throw new UnsupportedOperationException("Use test(int) instead.");
}

public void test(int a) { // Overloaded method
    int b = ...;
    super.test(a, b);
}

可以重载方法:名称相同,参数类型不同。

答案 3 :(得分:0)

Java不支持降低可见性。

有一种方法可以做这样的事情,但它很复杂:

  1. 您需要为父类型创建一个接口。此接口不需要方法。
  2. 您创建另一个实现方法Delegate
  3. 的新类型public void test(int a, int b)
  4. 您删除当前的父类型。
  5. 您创建了两个实现该接口的新类型。一个人将调用test(a,b)委托给Delegate,另一个创建新方法test(a),最终使用Delegate个实例。
  6. 因此,实现旧代码的类型永远不会被外部世界看到(它可能是一个包私有类)。