簡體   English   中英

如何防止子類繼承父類中的靜態方法

[英]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 (如果ChildParent在不同的程序包中,則可能將其聲明為private )。

但是即使這樣,如果Child類具有使用反射的權限,則可以輕松地使用它來調用Parent類中的private方法。 因此,除非您將代碼沙箱化,否則Java訪問修飾符不是安全機制。

如果您有權訪問超類,那么您是否只是將有問題的方法設為私有?

由於靜態方法基本上是可以在任何地方使用的浮動代碼,因此將方法移至另一個(實用程序)類

覆蓋簽名不執行任何操作。

  1. 如果您想讓您的方法只能訪問您的父類,則必須將方法設為私有
  2. 如果該方法必須限制包中的訪問,則必須將其設置為defaul(無訪問修飾符),例如:

      void hello(){ } 

    即使子類無法在包外部訪問此方法(但請記住,同一包中的子類可以訪問此方法)

希望這可以幫助 .....

如果您不希望子類繼承超類的任何方法,請將該方法設為超類private

例如

班級家長{

私人void foo(){

}

}

子級繼承父級{

}

在這種情況下,由於可見性級別是私有的,因此子類甚至對超級類中名為foo()的方法的存在都不具有可見性,因為它從未被繼承。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM