考虑到一些安全问题,我不希望子类继承父类的静态方法,甚至不调用这个方法,我该怎么做?请帮忙!
问问题
2946 次
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
(或者如果Child
和Parent
位于不同的包中,则可能是包私有。)
但即便如此,如果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
- 如果您希望您的方法只能由您的父类访问,您必须将您的方法设为私有
如果该方法必须限制在包中的访问,则必须将其设为默认(无访问修饰符)例如:
void hello(){ }
即使子类无法在包外访问该方法(但请记住,同一包中的子类可以访问该方法)
希望这可以帮助 .....
于 2012-12-13T04:06:34.227 回答
0
如果您不希望您的子类继承超类的任何方法,请将超类中的方法设为私有。
例如
班级家长{
私人无效 foo(){
}
}
类子扩展父{
}
在这种情况下,由于可见性级别是私有的,因此子类甚至无法看到超类中名为 foo() 的方法的存在,因为它从未被继承。
于 2013-04-11T06:31:40.310 回答