Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.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 - Fatal编程技术网

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

有没有办法禁止子类在java中调用超类的公共方法?,java,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 ext

有没有办法禁止子类在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.
但是我不希望狗能叫super.quark()而且我也不想改变

夸克方法在动物到私人中的修饰符。有什么方法可以防止编译时出现这种情况吗

我已经迷茫了几天了,谁能帮我

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

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

重写super类的public方法,然后像

例如。但是编译出了错误。我不知道为什么,怎么会这样?爪哇有吗


类似于的反射方式可以防止这种情况发生?

不,没有办法拥有子类无法调用的公共方法。您所能做的最好是将此建议记录下来


请注意,它被称为子类或子类。

否,根据
public
的定义,您无法阻止调用该方法(无论是从派生类还是其他任何地方)。当然,您可以通过将其设置为
final
来阻止它被重写(从而确保用于调用它的语法不会使用
super
;-),其他两个答案(&基本正确)

  • 可以防止子类从超类调用公共方法
  • 如果您这样做,您的设计可能有问题
  • 下面的父类有两个名为fatherMethod的公共方法。子类可以使用反射调用fatherMethod(感谢Matthew指出)。如果不使用反射,子类可能无法调用任何一个fatherMethod方法。因此它与私有方法非常类似

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

    您可以使用
    super
    调用final方法。没有真正的理由这么做,但这是允许的。首先感谢您的回复。在实际情况下,我无法更改类Animal中的任何内容,因为它是由其他人编写的。简短回答,不要这样做;如果您需要此功能,则说明您的设计有缺陷。请发布编译错误另外,请在报告错误的地方发布代码行。我这样做的原因是我在开发hudson scm插件时遇到了类似的问题。我创建了一个扩展SubversionSCM(Official类)的类.我只想重写super类的public方法,然后像示例一样调用super的public方法。但是编译时出现了错误。我不知道为什么,它是怎么做的?java是否有类似反射的方法来防止这种情况发生?超类方法是最终的吗?RU重写了它吗?它是静态的吗?它是泛型的吗?您是否仔细检查了参数ter types?双重检查名称?是否引发异常?子类不是最终的和静态的,我可以重写public方法,但不能在重写方法中调用super方法..你是否将@override标记放在该方法上?我怀疑你没有真正重写public方法。如果你在该方法上有@override标记,并且它不是编译器会告诉你,java是否有类似于反射的方法来防止这种情况发生?