前提・実現したいこと
Javaで四則演算を行うためのプログラムを作っています。
ポリモフィズムの学習のために、インタフェースや抽象クラスを用いて、定数や変数等を改めてクラス定義して作っています。
この際、変数の値を変更した演算結果をそれぞれ出力するのですが、一度初期化した後に変数を変更しても演算結果に変化が表れません。
初期化後に変数の値を変更した場合は、その変数が含まれているクラスには影響しないのでしょうか。
Javaやポリモフィズム等についてまだ理解が浅いため、説明に間違いがあると思われますが、寛大に見ていただけると幸いです。
有識者の方、ご教示お願いします。
該当のソースコード
Java
1interface Expression{ 2 double getValue(); // 演算結果を返す 3 int getPriority(); // 演算の優先順位を返す 4} 5 6abstract class BinaryOperator implements Expression{ 7 private Expression left, right; 8 9 public BinaryOperator(Expression left, Expression right){ 10 this.left = left; 11 this.right = right; 12 } 13 14 public abstract String getSymbol(); // 演算記号を返す 15 16 // 計算式の文字列を返す 17 public String toString(){ 18 return "(" + left + getSymbol() + right + ")"; 19 } 20} 21 22// 定数に対応 23class Num implements Expression{ 24 private double value; 25 26 Num(double value){ 27 this.value = value; 28 } 29 30 public double getValue(){ 31 return this.value; 32 } 33 34 public int getPriority(){ 35 return 0; 36 } 37 38 public String toString(){ 39 return "" + this.value; 40 } 41} 42 43// 変数に対応 44class Var implements Expression{ 45 private String name; // 変数名 46 private double var; // 変数の値 47 48 Var(String name, double var){ 49 this.name = name; 50 this.var = var; 51 } 52 53 public double getValue(){ 54 return this.var; 55 } 56 57 public int getPriority(){ 58 return 0; 59 } 60 61 // 変数の値を引数の値に変更 62 public void setValue(double a){ 63 this.var = a; 64 } 65 66 public String toString(){ 67 return this.name; 68 } 69} 70 71// 足し算 72class Add extends BinaryOperator{ 73 private double a; 74 private double b; 75 76 Add(Expression a, Expression b){ 77 super(a, b); 78 this.a = a.getValue(); 79 this.b = b.getValue(); 80 } 81 82 public String getSymbol(){ 83 return "+"; 84 } 85 86 public double getValue(){ 87 return this.a + this.b; 88 } 89 90 public int getPriority(){ 91 return 0; 92 } 93} 94 95public class Rep3 { 96 public static void main(String[] args){ 97 // 変数の定義 98 Var x = new Var("x", -10.0); 99 100 // 計算式の定義 101 Expression formula = new Add(x, new Num(50.0)); 102 103 // 計算式の出力 104 System.out.println("式:" + formula.toString()); 105 System.out.println("x = " + x.getValue() + " のときの値は" + formula.getValue()); 106 107 // 変数xの値の-10から10までの整数値で試す 108 for(int i = 0; i < 20; i++){ 109 x.setValue(x.getValue() + 1); 110 System.out.println("x = " + x.getValue() + " のときの値は" + formula.getValue()); 111 } 112 } 113} 114
// 出力結果 式:(x+50.0) x = -10.0 のときの値は40.0 x = -9.0 のときの値は40.0 x = -8.0 のときの値は40.0 x = -7.0 のときの値は40.0 x = -6.0 のときの値は40.0 x = -5.0 のときの値は40.0 x = -4.0 のときの値は40.0 x = -3.0 のときの値は40.0 x = -2.0 のときの値は40.0 x = -1.0 のときの値は40.0 x = 0.0 のときの値は40.0 x = 1.0 のときの値は40.0 x = 2.0 のときの値は40.0 x = 3.0 のときの値は40.0 x = 4.0 のときの値は40.0 x = 5.0 のときの値は40.0 x = 6.0 のときの値は40.0 x = 7.0 のときの値は40.0 x = 8.0 のときの値は40.0 x = 9.0 のときの値は40.0 x = 10.0 のときの値は40.0
試したこと
全パターンで配列を用意してループ中に初期化を行うと、目的の結果が出力されますが、できればこの方法は使いたくないと思っています。
補足情報(FW/ツールのバージョンなど)
Java 11.0.12
回答3件
あなたの回答
tips
プレビュー