2016-12-09 3 views
0

ここには、私が持っている問題を示すための単純な例があります。 私はカードクラスを持ち、プロパティは "price"です。
私は2人の子供、銅のクラスとシルバークラスを持っています。それぞれのクラスは、継承した価格と勝利の価値を持っています。 今、私は2枚の銅製のカードと1枚のシルバーカードを置くArrayListを "手"で作っています。ここまでOK。ステートメントSystem.out.println(hand.get(0));私は "私は銅カードです"といいます。これは問題ありません。 System.out.println(hand.get(0).getClass());私は "クラス銅"もOKです。..しかし、System.out.println(hand.get(0).getValue()); Do not work、CopperのgetValue()メソッドはアクセスできません。CardクラスのgetPrice()メソッドだけです。 私はここで同様の問題を見ましたが、答えはありません。どうもありがとう! ArrayList<Card> handしかし、あなたはあなたのCardクラスのgetValue()メソッドを持っていないので、すべての要素がCard種類あり、:あなたがリストを宣言しているため
PSは、ここでは、コードArrayList内の子オブジェクトのプロパティとメソッドは表示されません

public class Card { 

    int price; 
    public Card(int price) { 
     this.price = price; 
    } 
    public int getPrice() { 
     return price; 
    } 
    public String toString() { 
     return new String ("I am a card"); 
    } 
} 

public class Copper extends Card { 

    int value; 
    public Copper(int price, int value) { 
     super(price); 
     this.value = value; 

    public int getValue() { 
     return value; 
    } 
    public int getPrice() { 
     return price; 
    } 
    public String toString() { 
     return new String ("I am a Copper card"); 
    } 
} 

public class Silver extends Card{ 

    int value; 
    public Silver(int price, int value) { 
     super(price); 
     this.value = value; 
    } 
    public int getValue() { 
     return value; 
    } 
    public int getPrice() { 
     return price; 
    } 
    public String toString() { 
     return new String ("I am a Silver card"); 
    } 
} 

import java.util.ArrayList; 
public class Start { 

    public static void main (String[] args) 
    { 
     Card Card1 = new Copper(0,1); 
     Card Card2 = new Copper(0,1); 
     Card Card3 = new Silver(3,2); 
     ArrayList<Card> hand = new ArrayList<Card>(); 
     hand.add(Card1); 
     hand.add(Card2); 
     hand.add(Card3); 
     System.out.println(hand.get(0)); 
     System.out.println(hand.get(0).getClass()); // --> OK 
     System.out.println(hand.get(0).getPrice()); // --> OK 
     System.out.println(hand.get(0).getValue()); // --> NOT OK     
    } 
} 
+3

あなたの 'Card'クラスは' getValue() 'メソッドを持っていません - あなたは何を呼び出すと思いますか? 'Card'はおそらく抽象的で、抽象メソッド' getValue() 'を宣言する(あるいは' Card'自体にその機能を入れる)ように思えます。ありがとう。 –

+0

しかし、getClass()では、カードではなくCopperを返します。 – Bart

+0

実行時に*呼び出すオブジェクトの型を取得しているためです。コンパイル時の型と実行時の型の違いを理解することは非常に重要です。 –

答えて

3
System.out.println(hand.get(0).getValue()); // --> NOT OK 

です。

スーパークラス(Card)にgetValue()を作成し、サブクラスがこのメソッドで特別な処理を行う必要がある場合は、サブクラスをオーバーライドさせることができます。

+0

ありがとう。しかしgetClass()では、カードではなくCopperを返します。 – Bart

+0

@Bart getClass()はオブジェクトのランタイムクラスを返すので、正しいです。 apiを読んで、いくつかのテストをしてください。 – Kent

関連する問題