Java中的实例

Java中的实例,java,instance,instance-variables,Java,Instance,Instance Variables,我有四节课RunSO、MyGUI、MyMenuBar和NumberSettingsFile。我在MyGUI和MyMenuBar中有一个NumberSettingsFile的实例。问题是它们是独立的实例,所以当我在一个实例中使用方法时,它不会更新第二个实例中的值。我的问题是如何让这些实例协同工作。例如,如果我将sortComboBox的值设置为11。它在MyMenuBar中更新NumberSettingsFile的实例,但不在MyGUI中更新。因此,当按下按钮时,给出的值仍然是10。我如何让它在两

我有四节课
RunSO
MyGUI
MyMenuBar
NumberSettingsFile
。我在
MyGUI
MyMenuBar
中有一个
NumberSettingsFile
的实例。问题是它们是独立的实例,所以当我在一个实例中使用方法时,它不会更新第二个实例中的值。我的问题是如何让这些实例协同工作。例如,如果我将
sortComboBox
的值设置为
11
。它在
MyMenuBar
中更新
NumberSettingsFile
的实例,但不在
MyGUI
中更新。因此,当按下按钮时,给出的值仍然是
10
。我如何让它在两种情况下都更新值,这样当我按下按钮时,它会给出值
11
(在本例中)

这4个类的代码如下所示

数字设置文件

package SO;

public class NumberSettingsFile
{
    int numberSetting1 = 10;

    public int getNumberSetting1()
    {
        return numberSetting1;
    }

    public void setNumberSetting1(int newNumberSetting1)
    {
        numberSetting1 = newNumberSetting1;
    }
}
MyMenuBar

package SO;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;

public class MyMenuBar extends JMenuBar
{
    ArrayList<Integer> list = new ArrayList<Integer>();
    NumberSettingsFile uniSet = new NumberSettingsFile();
    JComboBox sortComboBox;
    MyGUI mG;

    public MyMenuBar(MyGUI mG)
    {
        this.mG = mG;
        setBorderPainted(true);
        makeMenuBar();
    }

    public void makeMenuBar()
    {       
        countTo(20);
        sortComboBox = new JComboBox(list.toArray());
        sortComboBox.setMaximumSize(new Dimension(100,25));
        sortComboBox.addItemListener(new sortComboBoxChanged());
        add(sortComboBox);
        sortComboBox.setSelectedItem(uniSet.getNumberSetting1());
    }

    public void countTo(int C)
    {
        for(int k =2; k<=C; k++)
        {
            list.add(k);
        }
    }

    class sortComboBoxChanged implements ItemListener
    {
        @Override
        public void itemStateChanged(ItemEvent e)
        {
            String s = sortComboBox.getSelectedItem()+"";
            uniSet.setNumberSetting1(Integer.parseInt(s));
            System.out.println("This is the number which should be shown if you click the button: "+uniSet.getNumberSetting1());
        }
    }
}

在此问题上,我将不胜感激。

您想在两个对象之间共享一个
NumberSettingsFile
实例。要做到这一点,您应该避免在类内部创建它,而是在创建两个类的地方创建它,并将它们传递给共享实例

在本例中,您的一个类已经是创建另一个类实例的类。因此,您应该传递
NumberSettingsFile
的实例:

MyMenuBar
中,不创建实例:

NumberSettingsFile uniSet = new NumberSettingsFile();
只需声明而不初始化:

NumberSettingsFile uniSet;
然后更改构造函数:

public MyMenuBar(MyGUI mG, NumberSettingsFile uniSet)
{
    this.mG = mG;
    this.uniSet = uniSet;
    setBorderPainted(true);
    makeMenuBar();
}
然后,在MyGui中更改菜单栏的创建:

mbr = new MyMenuBar(this, uniSet);

现在GUI和菜单栏之间只共享一个实例。

创建多个实例时,只需将一个实例传递给两个类,而不是创建多个实例?或者这不管用

   BaseClass has new NumberSettingFileInstance nsfi
      |                    |
new MyMenuBar(nsfi)     new MyGUI(nsfi)

我希望我粗糙的ASCII艺术图表能解释一些事情

你说的“齐心协力”是什么意思还不太清楚。但是如果你想让一个类有一组独立于该类的任何给定实例的变量,那么你可以将这些变量设置为静态的。@David我更新了这个问题。我希望这能让事情变得更清楚。我想我明白你的意思。感谢您的帮助,不过Real怀疑论者的答案非常有效。本质上,Real怀疑论者的答案与我的想法完全相同,只是执行方式不同-很高兴您解决了您的问题:)
mbr = new MyMenuBar(this, uniSet);
   BaseClass has new NumberSettingFileInstance nsfi
      |                    |
new MyMenuBar(nsfi)     new MyGUI(nsfi)