Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 对象/实例问题?_Java_Oop_Object_Instance_Instances - Fatal编程技术网

Java 对象/实例问题?

Java 对象/实例问题?,java,oop,object,instance,instances,Java,Oop,Object,Instance,Instances,所以这对我来说是一个相当复杂的问题,但我会尽我所能解释清楚- 我有一门课叫“调查”,内容是: 在我的问题课上,添加一个问题后,我得到1 然而,当我在调查课上打印出尺寸时,我得到了0 我相信这是因为Main使用了一个单独的调查实例来迭代问题列表,而不是在我的问题类中添加问题的实例 我会尽力消除任何困惑 您有多个调查实例,其中一个添加了一个问题,而另一个基本上没有问题。就这样 解决方案:只使用一个Survey实例,并在需要时将其传递到需要的位置,但不要创建新实例并期望它保持与其他实例相同的状态,因为

所以这对我来说是一个相当复杂的问题,但我会尽我所能解释清楚-

我有一门课叫“调查”,内容是:

在我的问题课上,添加一个问题后,我得到1

然而,当我在调查课上打印出尺寸时,我得到了0

我相信这是因为Main使用了一个单独的调查实例来迭代问题列表,而不是在我的问题类中添加问题的实例

我会尽力消除任何困惑


您有多个调查实例,其中一个添加了一个问题,而另一个基本上没有问题。就这样

解决方案:只使用一个Survey实例,并在需要时将其传递到需要的位置,但不要创建新实例并期望它保持与其他实例相同的状态,因为Java不是这样工作的。请注意,问题绝对不应创建调查实例。它可以将自己添加到现有实例中,但从头创建实例是没有意义的

编辑 您在评论中声明:


我就是这么想的!我是个业余爱好者,我努力坚持好的设计。survey.displayQuestions和survey.questions.addthis都需要survey对象来调用这些方法,但我将它们放在不同的类中。我不知道怎么只用一个


我自己的倾向是让问题类不了解调查,换句话说,它不应该持有调查实例,也不应该调用它的任何方法,因为它确实不需要了解调查,而编写OOP程序的目标是最小化连接。相反,无论哪个类创建问题实例,都要将问题放入调查对象。

您有多个调查实例,其中一个实例添加了一个问题,而另一个实例基本上没有问题。就这样

解决方案:只使用一个Survey实例,并在需要时将其传递到需要的位置,但不要创建新实例并期望它保持与其他实例相同的状态,因为Java不是这样工作的。请注意,问题绝对不应创建调查实例。它可以将自己添加到现有实例中,但从头创建实例是没有意义的

编辑 您在评论中声明:


我就是这么想的!我是个业余爱好者,我努力坚持好的设计。survey.displayQuestions和survey.questions.addthis都需要survey对象来调用这些方法,但我将它们放在不同的类中。我不知道怎么只用一个


我自己的倾向是让问题类不了解调查,换句话说,它不应该持有调查实例,也不应该调用它的任何方法,因为它确实不需要了解调查,而编写OOP程序的目标是最小化连接。相反,无论是哪个类创建问题实例,都要将问题放入调查对象。

您可能需要创建一个新类,返回问题的静态实例。这样,main和question类都可以请求静态列表的副本


在新类中,检查实例是否为null,如果为null,则新建静态实例,然后返回它。根据应用程序的复杂性,您可能需要考虑添加锁定以避免威胁安全问题。

您可能需要创建一个新类,返回问题的静态实例。这样,main和question类都可以请求静态列表的副本


在新类中,检查实例是否为null,如果为null,则新建静态实例,然后返回它。根据应用程序的复杂性,您可能希望考虑添加锁定以避免威胁安全问题。

这就是我的想法!我是个业余爱好者,我努力坚持好的设计。survey.displayQuestions和survey.questions.addthis都需要survey对象来调用这些方法,但我将它们放在不同的类中。我不知道如何只用一个。非常感谢,我非常感谢!我要试着去做你说的,再次感谢你:这就是我的想法!我是个业余爱好者,我努力坚持好的设计。survey.displayQuestions和survey.questions.addthis都需要survey对象来调用这些方法,但我将它们放在不同的类中。我不知道如何只用一个。非常感谢,我非常感谢!我要试着按照你说的去做,再次感谢:对不起,但我不得不否决这个答案。我们最不想推荐的是OP在不需要静态实例时创建静态实例。如果线程安全是一个问题,而我们完全没有任何迹象表明这一点,那么有更好的方法来解决这个问题,而不是把婴儿和洗澡水一起扔掉。他已经在创建一个静态实例,如果他需要它在主类和问题类之间徘徊,那么将它作为静态存储似乎是完全合理的
列表当然,我们对申请的了解还不够,无法做出决定。对不起,我不得不投票否决这个答案。我们最不想推荐的是OP在不需要静态实例时创建静态实例。如果线程安全是一个问题,而我们完全没有任何迹象表明这一点,那么有更好的方法来解决这个问题,而不是把婴儿和洗澡水一起扔掉。他已经在创建一个静态实例,如果他需要它在主类和问题类之间徘徊,那么将它作为静态存储似乎是完全合理的列表当然,我们对申请的了解还不够,无法做出决定。
ArrayList<Question> questions = new ArrayList<Question>();
survey.questions.size()
public class Survey {

public ArrayList<Question> questions = new ArrayList<Question>();

// Iterate over questions List
public void displayQuestions() {
    int numberCount = 1;
    int optionCount = 1;

     System.out.println(questions.size()); // PRINTS 0

    for (int i = 0; i < questions.size(); i++) {
        System.out.print("Question" + numberCount + ") ");
        System.out.println(questions.get(i).prompt);

        for(int j = 0; j < questions.get(i).options.size(); j++) {
            System.out.print(optionCount + ". ");
            System.out.println(questions.get(i).options.get(j));
        }
    }
}
public class Main {

    private static Survey survey = new Survey();
    // After selecting "Display Survey" menu option
    survey.displayQuestions();
public class Question {

    protected Survey survey = new Survey();
    // After finishing making the question
    survey.questions.add(this);
    System.out.println(survey.questions.size()); // PRINTS 1