![](/img/trans.png)
[英]Java: How to Create an instance of a subclass from with a Static method of the super class
[英]How to prevent a subclass inherit a static method in the super class
考慮到一些安全問題,我不希望子類從其父類繼承靜態方法,甚至不調用此方法,我該怎么做? 請幫忙!
靜態方法的繼承意義與實例方法不同。 如果將靜態方法聲明為public(或包私有),則無論子類中是否存在本地重新聲明,都可以訪問。 局部重新聲明僅意味着子類必須限定方法的名稱; 例如
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
在不同的程序包中,則可能將其聲明為private
)。
但是即使這樣,如果Child
類具有使用反射的權限,則可以輕松地使用它來調用Parent
類中的private
方法。 因此,除非您將代碼沙箱化,否則Java訪問修飾符不是安全機制。
如果您有權訪問超類,那么您是否只是將有問題的方法設為私有?
由於靜態方法基本上是可以在任何地方使用的浮動代碼,因此將方法移至另一個(實用程序)類
覆蓋簽名不執行任何操作。
如果該方法必須限制包中的訪問,則必須將其設置為defaul(無訪問修飾符),例如:
void hello(){ }
即使子類無法在包外部訪問此方法(但請記住,同一包中的子類可以訪問此方法)
希望這可以幫助 .....
如果您不希望子類繼承超類的任何方法,請將該方法設為超類private 。
例如
班級家長{
私人void foo(){
}
}
子級繼承父級{
}
在這種情況下,由於可見性級別是私有的,因此子類甚至對超級類中名為foo()的方法的存在都不具有可見性,因為它從未被繼承。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.