1

考虑到一些安全问题,我不希望子类继承父类的静态方法,甚至不调用这个方法,我该怎么做?请帮忙!

4

6 回答 6

3

静态方法与实例方法的继承意义不同。如果您将静态方法声明为公共(或包私有),则无论子类中是否存在本地重新声明,都可以访问它。本地重新声明仅意味着子类必须限定方法的名称;例如

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(或者如果ChildParent位于不同的包中,则可能是包私有。)

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

于 2012-12-13T03:44:03.513 回答
2

如果您可以访问超类,您不只是将有问题的方法设为私有吗?

于 2012-12-13T03:02:59.903 回答
2

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

于 2012-12-13T03:07:47.210 回答
1

覆盖签名不做任何事情。

于 2012-12-13T03:02:09.450 回答
0
  1. 如果您希望您的方法只能由您的父类访问,您必须将您的方法设为私有
  2. 如果该方法必须限制在包中的访问,则必须将其设为默认(无访问修饰符)例如:

     void hello(){
    }  
    

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

希望这可以帮助 .....

于 2012-12-13T04:06:34.227 回答
0

如果您不希望您的子类继承超类的任何方法,请将超类中的方法设为私有

例如

班级家长{

私人无效 foo(){

}

}

类子扩展父{

}

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

于 2013-04-11T06:31:40.310 回答