【问题标题】:Class instances share the value of a data member类实例共享数据成员的值
【发布时间】:2012-05-27 06:41:08
【问题描述】:

我正在编写一个程序来显示列表多项选择问题。我的 java 类的 ChoiceString 数据成员中存储的值有问题。类的每个实例都应该有自己的 ChoiceString 值,但由于某种原因,ChoiceString 只保存第一个实例初始化的值并与其他实例共享,我希望每个实例都有自己的 ChoiceString 唯一值。我该如何解决?

以下是我的代码:

   public class AllChoiceQuestion extends ChoiceQuestion{

  private String note = "Note: The following question has one or more correct choices\nYou must give the number(s) of ALL correct anwers, in order,\nto get full credit andsperated by spaces";
  private int count =0;
      // A varabile that will hold the user answer 
  private String choiceString;


public AllChoiceQuestion(String questionText) {
    // initilize the question text value
            super(questionText);
    choiceString="";

}

   public void addChoice(String choice, boolean correct){
       super.addChoice(choice, correct);
       if(correct == true){
           count++;
           choiceString +=   "" + count+" " ;
            }
       super.setAnswer(choiceString.trim());
       }

   public void display(){
      System.out.println(note);
      super.display();
   }

   public String toString(){
       return note +"\n"+ super.toString();

   }
 }

这是我的实例的代码

      ChoiceQuestion allchoicequestion1 = new AllChoiceQuestion("Which of the basic data type(s) has the size of 16 bit?");
      allchoicequestion1.addChoice("Char", true);
      allchoicequestion1.addChoice("Short", true);
      allchoicequestion1.addChoice("Float", false);
      allchoicequestion1.addChoice("Double", false);


      ChoiceQuestion allchoicequestion2 = new AllChoiceQuestion("Which of the basic data type(s) has the size of 64 bit?");
      allchoicequestion2.addChoice("Long", false);
      allchoicequestion2.addChoice("Doulbe", false);
      allchoicequestion2.addChoice("Byte", true);
      allchoicequestion2.addChoice("Int", true);

所以 allChoiceQuestion1 的 ChoiceStrng 应该是 1 2 并且 ChoiceString forallChoiceQuestion2 应该是 3 4 但是每次我将 3 4 作为 forallChoiceQuestion2 的答案时,它都会给我一个错误的答案,但如果我输入 1 2 它将是正确的

【问题讨论】:

  • AllChoiceQuestion 类看起来不错。您能否提供用于创建遇到问题的实例的代码?
  • 我编辑了我的帖子,并在底部添加了代码。
  • 哦,我明白了.. 非常感谢它现在正在工作。

标签: java datamember


【解决方案1】:

choiceString 每次在构造函数中都被初始化为 ""。

试试

choiceString = questionText;

【讨论】:

  • 我需要 ChoiceString 的值为空,因为用户将输入一个稍后将存储在choiceString 中的值;而 questionText 将保存一个字符串,程序员将在我创建该类的实例时初始化该字符串。因此,它们不能相互分配。
  • ...如果我可以对自己的答案投反对票,我会的。我想我没有仔细阅读
【解决方案2】:

您需要扩展 AllChoiceQuestion 并拥有像 NumberChoiceQuestionStringChoicQuestion 这样的子类,它们将拥有自己的 choiceString 实现,您需要在子类中重载 choiceString 实现并创建子类,这样您就可以拥有特定于子类的choiceString


 public class NumberChoiceQuestion extends AllChoiceQuestion{
        this.choiceString; // Over written value of choiceString specific to NumberChoiceQuestion
    }

public class StringChoiceQuestion extends AllChoiceQuestion{
        this.choiceString; // Over written value of choiceString specific to StringChoiceQuestion
    }

【讨论】:

  • ChoiceString 只是 AllChoiceQuestion 类的成员,我正在创建 AllChoiceQuestion 本身的一个实例。所以没有扩展 AllChoiceQuestion 的子类。问题是每次我创建 AllChoice 的实例时,ChoiceString 的值都由所有实例共享,而情况应该是每个实例都有自己的 ChoiceStng 副本。
【解决方案3】:

问题是当变量correct 为假时,您没有增加计数。因此,选择字符串将始终为 1 2。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-23
    • 1970-01-01
    • 2014-04-18
    • 2022-12-09
    • 1970-01-01
    • 1970-01-01
    • 2011-05-24
    相关资源
    最近更新 更多