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

每次都在增加。

您必须了解,当您有效地调用构造函数三次时,您将创建三个不同的类策略对象,每个对象都有自己的策略编号。

如果您希望有一个类的所有对象共有的变量,请将其声明为静态的。

于 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 回答