次の文B obj = new A();
は、2つのことを意味します。
obj
タイプB
のオブジェクトとして宣言されます。
obj
は、A
で定義されます。言い換えれば
あなたが他のB
のオブジェクトを使用するのと同じように、あなたはobj
使用することができます。タイプがB
であると宣言することによって、そのパースペクティブ(およびB
のスーパークラス)のみを使用するようにコンパイラを制限します。
したがって、を使用してobj
を定義するのはどういう意味ですか? A
のすべてのスーパークラスの原因となりますobj
を構築するためにA
のコンストラクタを使用して
は、(最初の親から下)を構築する、と毎回の方法は、彼らがスーパークラスで定義されたものを上書き定義されています。
メンバー変数/静的フィールドは、スーパークラスのものだけを影響します。つまり、パースペクティブを切り替えると、異なるフィールドにアクセスできます。しかし、メソッドは常にそれらを定義した最後のサブクラスによって定義されたものであることを覚えておくことは重要です。
コード例
public class Example
{
public static void main(String[] args)
{
Animal animal = new Animal();
System.out.println(animal.name);
animal.makeSound();
Animal doggy = new Dog();
System.out.println(doggy.name);
doggy.makeSound();
}
}
public class Animal {
public String name;
public Animal() {
name = "NameLess";
}
public void makeSound() {
System.out.println("What am I?");
}
}
public class Dog extends Animal {
public Dog() {
name = "Goofy";
}
public void makeSound() {
System.out.println("woof woof!");
}
}
この例の出力は次のようになります
NameLess
What am I?
Goofy
woof woof!