2017-07-12 21 views
1

申し訳ありませんが、私はまだコーディングが新しく、すべての用語がダウンしているとは限りません。うまくいけば、あなたはまだ私の質問を理解するでしょう。私が取得したい出力は次のようになります。しかしJava - 親クラスが子クラスからメソッドを呼び出していますか?

"Cost for Parent is: 77.77" 
"Cost for Child is: 33.33" 

、私はこれを取得しています:

"Cost for Parent is: 33.33" 
"Cost for Child is: 33.33" 

は、誰もが理由を理解することはできますか?私は私の心の中で

public class Parent{ 
    public double calculateCost(){ 
     return 77.77; 
    } 

    @Override 
    public String toString(){ 
     return "Cost for Parent is: " + calculateCost(); 
    } 
} 

public class Child extends Parent{ 
    @Override 
    public double calculateCost(){ 
     return 33.33; 
    } 

    @Override 
    public String toString(){ 
     return super.toString() + "\nCost for Child is: " + calculateCost(); 
    } 

    public static void main(String[] args){ 
     Child child1 = new Child(); 
     System.out.println(child1.toString()); 
    } 
} 

は、子クラスのtoString()が親クラスからのtoString()を呼び出すことでなければなりません...以下の私のコードの簡易版を持っていますが、それと同じ背後にあるロジックを保持しました(したがって、ParentクラスからのcalculateCost())、次にChildからcalculateCost()を追加します。 super.toString()内のスーパーは、その中にあるcalculateCost()には適用されません。また

は、私は、このような子クラスにtoString()を書くことによって、それを回避することができます知っている:

@Override 
    public String toString(){ 
     return "Cost for Parent is: " + super.calculateCost() + "\nCost for Child is: " + calculateCost(); 
    } 

が、ポイントは、私は、コードを繰り返したくないということであると私は「そのdをオーバーライドする前のtoString()メソッドに追加します。助けてください、または私に指示してください(私は何のためにグーグルがすべきかわかりません...)ありがとう!

+3

*また、このようにChildクラスにtoString()を記述することで回避することができます。*これが行う方法です。 –

+0

実際はそうです。時々、私たちはいつも私たちが望むものを得ることができません。 –

+0

オーバーライドのポイントは何ですか? –

答えて

0

calculateCostChildクラスでオーバーライドされます。したがってChildからsuper.toString()が呼び出された場合、super.toString()calculateCost()ChildcalculateCostとなります。

ParentcalculateCostを呼び出すには、Childクラスにsuper.calculateCost()を明示的に指定する必要があります。

+0

私はそうするだろうと思う。私はChildのtoString()が基本的にParentからtoString()と同じものを表示するべきだと思っていましたが、ちょっとだけ、私はtoString()をParentクラスから再利用する方法があることを期待していました繰り返されるコードの数行を書き直すほど簡単ではないイベントです。 – FMP2000

0

toStringメソッドでcalculateCost()を呼び出していることに注意してください。したがって、子供のcalculateCost()が呼び出されています。次のようにChildのtoString関数を使用することを検討します。

class Parent{ 
public double calculateCost(){ 
    return 77.77; 
} 

@Override 
public String toString(){ 

    return "Cost for Parent is: " + calculateCost(); 
} 
} 

class Child extends Parent{ 
@Override 
public double calculateCost(){ 
    return 33.33; 
} 

@Override 
public String toString(){ 
    return "Cost for Parent is: " + super.calculateCost() + "\nCost for 
Child is: " + calculateCost(); 
} 
} 
-1

私はあなたができる最良のことは、デバッグモードを使用することで、どのように動作するかを理解することができると思います。あなたのコードを読んだ後、私はそれをどのように実行したいのか理解しています。

しかし、私はあなたが@Override注釈を実装する方法に問題があると思います。

@Override注釈の意味は、文字通り親クラスからオーバーライド をしていた新しいメソッドを実装することです。この場合

あなたは子クラスのcalculatecostをオーバーライドするので、親クラスのpublic double calculateCost()は使用されません。

私はそれをうまく説明してくれることを願っています。しかし、この場合は、@Overrideの詳細を調べて、それがどのように動作するのか理解することが必要です。

+1

'Child'の' calculateCost() 'は' Parent 'の存在を単に上書きします。 '@ Override'アノテーションのためではありません。 '@ Override'自体は何もしません。コンパイラとプログラマの両方にとって、それは非常に有益です。 –

+0

ああ、その明確化のためにありがとう。私は間違って教えられてきた。 –

-1

親オブジェクトと子オブジェクトを作成することをお勧めします。スーパーを削除します。

public class Parent{ 
    double cost = 77.77; 
    public double calculateCost(){ 
     return cost; 
    } 

    @Override 
    public String toString(){ 
     return "Cost for Parent is: " + this.calculateCost(); 
    } 

} 

public class Child extends Parent{ 
    @Override 
    public double calculateCost(){ 
     return 33.33; 
    } 

    @Override 
    public String toString(){ 
     return "\nCost for Child is: " + calculateCost(); 
    } 

    public static void main(String[] args){ 
     Parent parent = new Parent(); 
     Child child1 = new Child(); 
     System.out.println(parent.toString() + child1.toString()); 
    } 
} 

プリント::これは、Javaにアップキャストされ

Cost for Parent is: 77.77 
Cost for Child is: 33.33 
+0

これは問題を解決しません。それは?目的の出力を得るために 'Child'に関係しない新しい' Parent'インスタンスを導入します。 – ChiefTwoPencils

0

子供のtoStringメソッドからのtoString、あなたは同じ結果を得ることができます。
サブクラスと親クラスにすべてメソッドがある場合、そのサブクラスを実行します。ない場合は、あなたがあなたの親クラスであるcalculateCost

方法を含むのtoStringメソッドを呼び出しますが、その後、親クラスをexcuteますが、実際には、サブクラスでcalculateCost方法はexeutedされます。

あなたは以下のようにコードを修正することができます:

親クラス

public class Parent{ 
    public double calculateCostParent(){ 
     return 77.77; 
    } 


    public String toString(){ 
     return "Cost for Parent is: " + calculateCostParent(); 
    } 
} 

託児クラス

public class Child extends Parent{ 

    public double calculateCost(){ 
     return 33.33; 
    } 

    @Override 
    public String toString(){ 
     return super.toString() + "\nCost for Child is: " + this.calculateCost(); 
    } 

    public static void main(String[] args){ 
     Child child1 = new Child(); 
     System.out.println(child1.toString()); 
    } 
} 

出力

Cost for Parent is: 77.77 
Cost for Child is: 33.33 

次に、親とサブクラスが同じ名前のメソッドを同時に持つことを避けることができます。

0

実際の型に基づいて呼び出されるオーバーライドされたメソッドの最適な一致に依存することができます。この場合、インスタンスはChildです。したがって、オーバーライドされたメソッドまたはオーバーライドされていないインスタンスメソッド内でオーバーライドされたメソッドを呼び出すと、Childの実装が表示されます。言い換えれば、

Parent p = new Child(); 
System.out.println(p); 

でも同じ結果が得られます。

+0

いいえ、それはありません。 –

+0

@amostabeginner、精巧に注意してください? – ChiefTwoPencils

+0

33.33が印刷されます。 –

関連する問題