1. ホーム
  2. java

[解決済み] Javaにおけるメソッド隠蔽とは何ですか?JavaDocの説明でもわかりにくい

2022-03-13 21:19:44

質問

ジャバドック は言う。

<ブロッククオート

の場合、呼び出される隠しメソッドのバージョンはスーパークラスのものであり、呼び出されるオーバーライドされたメソッドのバージョンはサブクラスのものである。

は、私にはピンとこないのですが。この意味がわかるようなわかりやすい例があれば、ぜひ教えてください。

どのように解決するのですか?

public class Animal {
    public static void foo() {
        System.out.println("Animal");
    }
}

public class Cat extends Animal {
    public static void foo() {  // hides Animal.foo()
        System.out.println("Cat");
    }
}

ここです。 Cat.foo() を隠すと言われています。 Animal.foo() . 静的メソッドはポリモーフィックではないので、オーバーライドのように隠蔽することはできません。そのため、以下のようなことが起こります。

Animal.foo(); // prints Animal
Cat.foo(); // prints Cat

Animal a = new Animal();
Animal b = new Cat();
Cat c = new Cat();
Animal d = null;

a.foo(); // should not be done. Prints Animal because the declared type of a is Animal
b.foo(); // should not be done. Prints Animal because the declared type of b is Animal
c.foo(); // should not be done. Prints Cat because the declared type of c is Cat
d.foo(); // should not be done. Prints Animal because the declared type of d is Animal

クラスではなくインスタンスに対して静的メソッドを呼び出すことは、非常に悪い習慣であり、決して行ってはいけません。

インスタンスメソッドはポリモーフィックであり、オーバーライドされます。呼び出されるメソッドは、オブジェクトの具体的な実行時型に依存します。

public class Animal {
    public void foo() {
        System.out.println("Animal");
    }
}

public class Cat extends Animal {
    public void foo() { // overrides Animal.foo()
        System.out.println("Cat");
    }
}

すると、次のようになります。

Animal a = new Animal();
Animal b = new Cat();
Cat c = new Cat();
Animal d = null;

a.foo(); // prints Animal
b.foo(); // prints Cat
c.foo(); // prints Cat
d.foo(): // throws NullPointerException