Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

コンストラクタに値をセット

JAVAを勉強中のものです。
下記のようなプログラムを作成中です。

クラス←クラス←メインメソッド(出力)

public class Kaimono {
     int daiamond;
     int ruby;
    
    public Kaimono(){
        daiamond = 0;
        ruby = 0;
        
        }
    public int Calculation(){
        int kotae = daiamond * ruby;
        return kotae;
    }


}

public class Zeikasan {
    Kaimono kaimono1 = new Kaimono();
    
        kaimono1.daiamond = 10000;
        kaimono1.ruby = 5000;
        
        
    public int zeikin(int tax){
        int kotae = (int)((double)kaimono1.Calculation() * (double)tax * 0.01) + kaimono1.Calculation();
        return kotae;
    }
}

public class KaimonoTest {

    public static void main(String[] args) {
        Zeikasan zeitest1 = new Zeikasan();
        
        
        int kekka = zeitest1.zeikin(5);
        System.out.println(kekka);
        
        

    }

}

Zeikasanクラスでkaimono1というオブジェクトを生成し
Kaimonoクラスのdaiamondとrubyというプロパティに
値をセットしようと思うのですが、エラーが出てしまいます。
このようなセットはできないのでしょうか?
宜しくお願いいたします。

3

回答

6696

閲覧

3件の回答

評価

0

まず、根本的に、作り方が違います。
ふつう、「買い物をする」「税加算する」という、「動作」は、クラスにしないものです。
この場合、「ダイヤモンド」「ルビー」という、「モノ」をクラスにすることを、考えてください。

また、class Kaimonoのフィールドdiamondとrubyを、直接外からセットできるようにしているのも問題です。
フィールドは、基本的にpublicなメソッド(セッター)によって値を入れるように作ります。

>このようなセットはできないのでしょうか?
できません。
フィールド宣言は、同時に初期化は使えますが、
フィールドのなかの値の初期化には使えません。

そういう場合は、Kaimonoクラスのコンストラクタの引数で
渡すように作るか、あるいはZeikasanクラスのコンストラクタで、
new→セッタの形で作ります。

でも、まずはクラスの作り方から考え直すことを、おすすめします。

評価

0

ちょっとおかしい…。

>フィールドのなかの値の初期化には使えません。
そのインスタンスのなかのフィールドの初期化には使えません。

評価

0

>しんごさん

package test;
public class Zeikasan {
    Kaimono kaimono1 = new Kaimono();
    
    {
        kaimono1.daiamond = 10000;
        kaimono1.ruby = 5000;
    }   
        
    public int zeikin(int tax){
        int kotae = (int)((double)kaimono1.Calculation() * (double)tax * 0.01) + kaimono1.Calculation();
        return kotae;
    }
}

↑これは可能です。
{〜} で囲めば「暗黙のコンストラクタ」になり、
自動的に実行されます。

フィールドが static の場合は

static {
  フィールドの初期化
}

等と使えます。将来思い出して使う時が来るかも?

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。