いくつかのセキュリティ上の問題を考慮して、サブクラスがそのスーパークラスから静的メソッドを継承したくなく、このメソッドを呼び出すことさえしたくありません。どうすればこれを行うことができますか? 助けてください!
6 に答える
静的メソッドは、インスタンス メソッドと同じ意味で継承されません。静的メソッドをパブリック (またはパッケージ プライベート) として宣言すると、子クラスにローカル再宣言があるかどうかに関係なくアクセスできます。ローカル再宣言は、子クラスがメソッドの名前を修飾する必要があることを意味するだけです。例えば
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
を簡単に呼び出すことができます。したがって、コードをサンドボックス化している場合を除き、Java アクセス修飾子はセキュリティ メカニズムではありません。private
Parent
スーパークラスにアクセスできるなら、問題のメソッドを非公開にするだけではありませんか?
静的メソッドは基本的にどこにでも存在できるフローティング コードであるため、メソッドを別の (ユーティリティ) クラスに移動します。
何もしないように署名をオーバーライドします。
- メソッドに親クラスのみがアクセスできるようにする場合は、メソッドをプライベートにする必要があります
メソッドがパッケージ内でアクセスを制限する必要がある場合は、それをデフォルト (アクセス修飾子なし) にする必要があります。例:
void hello(){ }
サブクラスがパッケージ外でこのメソッドにアクセスできない場合でも (ただし、同じパッケージ内のサブクラスがこのメソッドにアクセスできることに注意してください)
お役に立てれば .....