有没有办法禁止子类在java中调用超类的公共方法?

时间:2010-09-12 04:27:28

标签: java

有没有办法禁止子类在java中调用超类的公共方法?

例如

public abstract class TObject{
    abstract public void quark();
}


public class Animal extends TObject{

       public void quark(){
           System.out.println("this is the animal");
       }

}

public class Dog extends Animal{
       @overide
       public void quark(){
           System.out.println("this is the animal");
           **super.quark();**
       }
} 

In this example, The Dog call the **super.quark();** in it's quark method.

但我不希望Dog可以调用 super.quark(); 而我也不想改变

动物中的夸克方法的修饰符为私有。有没有办法在编译中阻止这种情况?

我有几天困惑,谁能帮助我........

我这样做的原因是我在开发 hudson scm插件时遇到了类似的问题.I

创建了扩展SubversionSCM(官方类)的类。我只是想

覆盖超类的公共方法,然后调用super的公共方法,如

例子。但编译给出了错误。我不知道为什么,怎么办?剂量java有

类似反映方式以防止这种情况?

3 个答案:

答案 0 :(得分:5)

不,根据public的定义,您无法阻止调用该方法(无论是派生类还是其他任何方法)。您当然可以阻止它被覆盖(从而确保用于调用它的语法不会使用super ;-)使其成为final

答案 1 :(得分:2)

不,没有办法让子类无法调用公共方法。你能做的最好的就是记录这个建议。

作为一个注释,它被称为子类或子类。

答案 2 :(得分:0)

其他2个答案(Alex& Matthew)基本上是正确的。

  1. 您可以阻止子类从超类
  2. 调用公共方法
  3. 如果你这样做,你的设计可能有问题。
  4. 下面的Father类有两个名为fatherMethod的公共方法。子类可以使用反射调用fatherMethod(谢谢Matthew指出这一点。)不使用反射,子类可能无法调用fatherMethod方法。因此它与私有方法非常相似。

    class Father
    {
        private class Alpha { }
    
        private class Beta { }
    
        public void fatherMethod ( Alpha param )
        {
        }
    
        public void fatherMethod ( Beta param )
        {
        }
    }