2017-12-20 14 views
0
class A extends B 
{ 
    public static void main(String[] args) 
    { 
     B obj = new A(); 
     obj.speak(); //error :the method speak() undefined for type B 
    } 

    public void speak() 
    { 
     System.out.println("in speak"); 
    } 
} 

class B { 
} 

私はJavaの初心者ですが、私はこの行が何を意味するのか理解できませんB obj = new A();どうしてAは自分のメソッドにアクセスできないのですか?クラスAがインスタンス化していて、そのメソッドにアクセスできない理由を詳細に説明してください。スーパークラスのオブジェクトがサブクラスのメソッドにアクセスできない

答えて

1

次の文B obj = new A();は、2つのことを意味します。

  1. objタイプBのオブジェクトとして宣言されます。

  2. 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! 
関連する問題