如何防止子类继承超类中的静态方法

时间:2012-12-13 03:00:39

标签: java subclass inheritance

考虑到一些安全问题,我不希望子类从其超类继承静态方法,甚至不调用此​​方法,我该怎么做?请帮忙!

6 个答案:

答案 0 :(得分:3)

静态方法不是以与实例方法相同的意义继承的。如果将静态方法声明为public(或包private),则无论子类中是否存在本地重新声明,都可以访问它。本地重新申报仅仅意味着子类必须符合方法的名称; e.g。

public class Parent {
    public static void foo() { ... }
}

public class Child {
    public static void foo() { ... }
    public static void main(String[] args) {
        foo();  // calls local override
        Parent.foo(); // calls original version.
}

如果您不希望Child类能够调用Parent.foo方法,那么您需要将其声明为private(或者如果{{1 }}和Child位于不同的包中。)

但即便如此,如果Parent类有权使用反射,那么它可以轻松地使用它来调用Child类中的private方法。因此,除非您对代码进行沙盒处理,否则Java访问修饰符不是安全机制。

答案 1 :(得分:2)

如果您有权访问超类,那么您是否只是将该方法设为私有?

答案 2 :(得分:2)

由于静态方法基本上是可以在任何地方生活的浮动代码,因此将方法移动到另一个(实用程序)类

答案 3 :(得分:1)

覆盖签名以不执行任何操作。

答案 4 :(得分:0)

  1. 如果您希望您的方法只能访问您的父类 必须使你的方法成为私人
  2. 如果方法必须限制您必须在包中进行访问 它作为默认(无访问修饰符)例如:

     void hello(){
    }  
    

    即使子类无法在包外部访问此方法(但请记住,同一包中的子类可以访问此方法)

  3. 希望这会有所帮助.....

答案 5 :(得分:0)

如果您不希望您的子类继承超类的任何方法,请在超类私有中创建该方法。

例如

  

Class Parent {

     

private void foo(){

     

}

     

}

     

class Child扩展Parent {

     

}

在这种情况下,由于可见性级别是私有的,因此子类甚至不能看到超类中存在名为foo()的方法,因为它从未被继承过。