【问题标题】:Static Class Variable Concept Not Work?静态类变量概念不起作用?
【发布时间】:2013-10-06 23:31:35
【问题描述】:

我已经开发了示例项目作为类变量(静态)的证明概念。但是当我运行StaticCounter.java 类的两个实例时,共享变量(静态)会给这两个实例不同的引用?!!。

Static Variable Documentation:

  • 类变量(静态字段) 类变量是使用 static 修饰符声明的任何字段; 这告诉编译器这个变量只存在一个副本,无论该类被实例化了多少次。定义特定类型自行车的齿轮数量的字段可以标记为静态,因为从概念上讲,相同数量的齿轮将应用于所有实例。代码 static int numGears = 6;会创建这样一个静态字段。此外,可以添加关键字 final 来表示齿轮的数量永远不会改变。

StaticCounter.java的代码:

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

public class StaticCounter extends JFrame {

public static int COUNTER = 0;
private JButton btnCounter;
private JButton btnShowValue;
private JLabel lblCounter;

public StaticCounter() {
    initComponents();
}

private void initComponents() {

    btnShowValue = new JButton();
    btnCounter = new JButton();
    lblCounter = new JLabel();

    setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

    btnShowValue.setText("Show Value");
    btnShowValue.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent evt) {
            showValue(evt);
        }
    });

    btnCounter.setText("Counter +1");
    btnCounter.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent evt) {
            doCount(evt);
        }
    });

    lblCounter.setFont(new Font("Tahoma", 1, 36)); 
    lblCounter.setText("0");

     GroupLayout layout = new GroupLayout(getContentPane());
    getContentPane().setLayout(layout);
    layout.setHorizontalGroup(
            layout.createParallelGroup( GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
            .addContainerGap()
            .addGroup(layout.createParallelGroup( GroupLayout.Alignment.LEADING)
            .addGroup( GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
            .addGap(0, 0, Short.MAX_VALUE)
            .addComponent(btnCounter)
            .addPreferredGap( LayoutStyle.ComponentPlacement.RELATED)
            .addComponent(btnShowValue))
            .addComponent(lblCounter,  GroupLayout.DEFAULT_SIZE,  GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
            .addContainerGap()));
    layout.setVerticalGroup(
            layout.createParallelGroup( GroupLayout.Alignment.LEADING)
            .addGroup( GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
            .addContainerGap()
            .addComponent(lblCounter,  GroupLayout.DEFAULT_SIZE, 55, Short.MAX_VALUE)
            .addPreferredGap( LayoutStyle.ComponentPlacement.RELATED)
            .addGroup(layout.createParallelGroup( GroupLayout.Alignment.BASELINE)
            .addComponent(btnShowValue)
            .addComponent(btnCounter))
            .addContainerGap()));

    pack();
}                 

private void doCount( ActionEvent evt) {
    ++StaticCounter.COUNTER;
    lblCounter.setText(String.valueOf(StaticCounter.COUNTER));
}

private void showValue( ActionEvent evt) {
    JOptionPane.showMessageDialog(null, String.valueOf(StaticCounter.COUNTER));
}

public static void main(String args[]) {

    EventQueue.invokeLater(new Runnable() {
        @Override
        public void run() {
            new StaticCounter().setVisible(true);
        }
    });
}
}

现在如果你运行它两次或三次,静态将是实例变量而不是类变量?但是,如果我在一次类的运行中将主初始化更改两次或三次,它可以正常工作吗?

public static void main(String args[]) {

    EventQueue.invokeLater(new Runnable() {
        @Override
        public void run() {
            new StaticCounter().setVisible(true);
            new StaticCounter().setVisible(true);
        }
    });
}
}

那么,为什么?!

【问题讨论】:

  • 我不明白问题出在哪里。
  • 不同进程之间不共享静态变量。
  • 这是一个过程。有两个框架使用相同的静态变量。
  • @Steinar 感谢您提供此信息,现在我明白了 :-)

标签: java static class-variables


【解决方案1】:

静态变量在您的代码中有效。如果您单击一帧中的按钮并在另一帧中显示它,它会显示正确的增量值。如果你想自动更新UI,那是完全不同的事情,这与静态或非静态无关。

如果您有疑问,只需在方法doCount() 中添加登录即可。然后您将看到计数器正确更改,并且所有帧的计数器都是相同的。所以静态没有问题。

【讨论】:

    【解决方案2】:

    在这个例子中

    @Override
    public void run() {
        new StaticCounter().setVisible(true);
    }
    

    没有太多可看的,因为您只有一个 StaticCounter 对象。当您单击Counter++ 按钮时,该值会上升。到这里还好吗?

    在这一个

    @Override
    public void run() {
        new StaticCounter().setVisible(true);
        new StaticCounter().setVisible(true);
    }
    

    更容易看到static 的行为。当您单击JFrameCounter++ 按钮之一时,您会看到该值上升。显然它不会改变另一个窗口,因为你还没有重绘它,但是如果你点击另一个的按钮,你会看到下一个值从static 计数器所在的位置继续。这证明了在JVM中计数器只有一个实例。

    【讨论】:

      猜你喜欢
      • 2012-12-23
      • 1970-01-01
      • 2012-10-24
      • 2012-03-15
      • 2014-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多