English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

なぜ親クラスの静的方法がJavaの子クラスで隠されますか?

クラスが2つある場合、1つがもう1つのクラスを拡張しているとき、これらのクラスが同じメソッドを持っている場合(引数と返値の型を含む、例えば、サンプル)、サブクラスのメソッドはスーパークラスのメソッドをオーバーライドします。

これは継承によるものであるため、サブクラスをインスタンス化すると、サブクラスオブジェクトの中にスーパークラスのメンバのコピーが作成されます。したがって、これらのメソッドはサブクラスのオブジェクトで使用できます。

しかし、メソッドを呼び出すと、(サンプル)、子クラスのサンプルメソッドが実行され、超クラスのメソッドをオーバーライドします。

class Super{
   public static void sample(){
      System.out.println("スーパークラスのメソッド");
   }
}
public class OverridingExample extends Super {
   public static void sample(){
      System.out.println("サブクラスのメソッド");
   }
   public static void main(String args[]){
      Super obj1 = (Super) new OverridingExample();
      OverridingExample obj2 = new OverridingExample();
      obj1.sample();
      obj2.sample();
   }
}

出力結果

スーパークラスのメソッド
サブクラスのメソッド

静的メソッドをオーバーライドする

超クラスとサブクラスが同じメソッド(引数を含む)を持ち、それらが静的であるかどうか。サブクラスのメソッドは超クラスのメソッドを隠します。

このメカニズムは「メソッドの隠し」の略称で、超クラスとサブクラスが静的の同じシグネチャを持つメソッドを持っているにもかかわらず、オーバーライドとは見なされません。

class Super{
   public static void demo() {
      System.out.println("This is the main method of the superclass");
   }
}
class Sub extends Super{
   public static void demo() {
      System.out.println("これはサブクラスのメインメソッドです");
   }
}
public class MethodHiding{
   public static void main(String args[]) {
      MethodHiding obj = new MethodHiding();
      Sub.demo();
   }
}

出力結果

これはサブクラスのメインメソッドです

メソッドを隠す理由

オーバーロードの鍵は、親クラスと子クラスが同じシグネチャを持つメソッドを持っている場合、子クラスのオブジェクトに対して、両方のメソッドが利用可能です。オブジェクトを保存するためのオブジェクトのタイプ(参照)に応じて、適切なメソッドが実行されます。

SuperClass obj1 = (Super) new SubClass();
obj1.demo() // スーパークラスのdemoメソッドを呼び出します
SubClass obj2 = new SubClass();
obj2.demo() //サブクラスのdemoメソッドを呼び出します

しかし、静的メソッドの場合、それらは任何のインスタンスに属していないため、クラス名を使用してアクセスする必要があります。

SuperClass.demo();
SubClass.Demo();

したがって、親クラスと子クラスが同じシグネチャを持つ静的メソッドを持っている場合、子クラスのオブジェクトは親クラスのメソッドのコピーを使用できます。それらは静的であるため、メソッド呼び出しはコンパイル時に自動的に解決されるため、静的メソッドはオーバーライドできません。

しかし、静的メソッドのコピーが使用できるため、子クラスのメソッドを呼び出した場合、再定義されます。/超クラスのメソッドを隠す方法。

おすすめのコンテンツ