2

メソッドが呼び出されるたびにpolicyNumberが1ずつ増えないのはなぜだろうか。私がそれを実行するとき、私はこれを手に入れます。

追加した各ポリシーを自動的にPolicyNumber++にしようとしています。代わりに、同じ番号を取得しています。代わりに、私が作成するすべての新しいポリシーに同じ値が割り当てられます。

run:
Policy #3 with amount $320.0
Policy #3 with amount $500.14
Policy #3 with amount $0.0
false

私は以前にこの方法を使用しましたが、なぜ今は機能しないのかわかりません。誰かが光を当ててくれませんか。ありがとうございました!

メインクラス

public class Assignment3 {

    public static void main(String[] args) {        
        Policy p1 = new Policy(320); 
        Policy p2 = new Policy(500.14);
        Policy p3 = new Policy(0);
        System.out.println(p2.policyNumber);
        p1.print(); System.out.println();
        p2.print(); System.out.println(); 
        p3.print(); System.out.println();
        System.out.println(p1.isExpired()); 
    }
}

ポリシークラス

public class Policy {
    double amount;
    public int policyCount;
    public static int policyNumber;

    public Policy(){
        amount = 0;
        policyCount = 1;
        policyNumber=0;
    }

    public Policy(double a){
        amount = a;
        policyNumber ++;
     }

    public boolean isExpired(){
        return false;
    }

    public void print(){
        System.out.print("Policy #" + this.policyNumber + " with amount $" + this.amount);
        }

}
4

6 に答える 6

2

問題はそれpolicyNumberが静的ではないということです。したがって、これはインスタンス変数であり、インスタンス化するすべてのオブジェクトに対して独自の値を持ちます。それをクラス変数にしたい場合は、静的に宣言する必要があります。

public static int policyNumber;

クラス変数とインスタンス変数の違いについては、この公式ドキュメントを確認してください。

さらに、静的カウンターをインスタンス変数に割り当てる必要があります。静的変数を使用するだけの場合、すべてのインスタンスにクラス変数の値が含まれます。各インスタンスに値を割り当てる場合は、クラス変数の値をインスタンス変数にコピーする必要があります。

public class Policy {
   double amount;
   public int policyCount;
   public static int policyNumber = 0;

   private int myPolicyNumber;

   public Policy(double a){
    amount = a;
    myPolicyNumber = policyNumber;
    policyNumber ++;

   //or even better
   //myPolicyNumber = ++policyNumber;

  }
}

次に、印刷メソッドは次のようになります。

public void print(){
    System.out.print("Policy #" + myPolicyNumber + " with amount $" + this.amount);
}

また、情報隠蔽の原則に従うために、インスタンス変数は通常プライベートである必要があることにも注意してください。

于 2013-01-31T10:13:56.667 に答える
0

に変更します

public static int policyNumber;

staticキーワードを使用すると、Javaは、新しいオブジェクトを作成するときに変数の値を保持します。

これをチェックしてください:

http://www.java-samples.com/showtutorial.php?tutorialid=285

于 2013-01-31T10:14:05.117 に答える
0

policyNumberを静的変数として使用します。

于 2013-01-31T10:14:28.233 に答える
0

試す:

public static int policyNumber;
于 2013-01-31T10:15:25.237 に答える
0

毎回増えています。

コンストラクターを効果的に 3 回呼び出すと、それぞれ独自のポリシー番号を持つクラス ポリシーの 3 つの異なるオブジェクトが作成されることを理解する必要があります。

クラスのすべてのオブジェクトに共通の変数が必要な場合は、それを静的に宣言します。

于 2013-01-31T10:16:48.190 に答える
0

まず、policyNumber 変数はメンバー変数であり、クラス変数ではありません。クラス インスタンス間でアクセスする場合は、静的にする必要があります。

public int policyNumber; // Not suited for your case.

代わりに、次のことを試してください。

public static int policyNumber = 0;

次に、Policy クラスのインスタンスを作成するたびに policyNumber を再初期化しています。

public Policy()
{
    policyNumber = 0; // Why to re-initialize it as you want to persist its value.
}

代わりに、次のことを試してください。

public Policy()
{
    policyNumber++; 
}
于 2013-01-31T10:36:57.717 に答える