Java 静态类变量概念不起作用?

Java 静态类变量概念不起作用?,java,static,class-variables,Java,Static,Class Variables,我开发了一个示例项目作为类变量(静态)的证明概念。但是当我运行StaticCounter.java类的两个实例时,共享变量(static)将给这两个实例提供不同的引用 类变量(静态字段)类变量是使用静态修饰符声明的任何字段这告诉编译器该变量只有一个副本存在,不管该类被实例化了多少次。定义特定类型自行车档位数量的字段可以标记为静态,因为概念上相同的档位数量将应用于所有实例。代码static int numGears=6;将创建这样一个静态字段。此外,还可以添加关键字final,表示档位的数量永

我开发了一个示例项目作为类变量(静态)的证明概念。但是当我运行
StaticCounter.java
类的两个实例时,共享变量(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);
        }
    });
}
}
现在,如果您运行它两次或三次,静态变量将是实例变量而不是类变量?但是,如果我在一次运行类时在main中更改初始化两次或三次,它会正常工作吗

public static void main(String args[]) {

    EventQueue.invokeLater(new Runnable() {
        @Override
        public void run() {
            new StaticCounter().setVisible(true);
            new StaticCounter().setVisible(true);
        }
    });
}
}
那么,为什么在本例中

@Override
public void run() {
    new StaticCounter().setVisible(true);
}
因为您只有一个
StaticCounter
对象,所以没有什么可看的。单击
计数器+++
按钮时,该值将升高。很好,直到这里

在这个

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

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

静态变量在代码中起作用。如果您在一个帧中单击按钮并在另一个帧中显示它,它将显示正确的递增值。若你们想自动更新UI,这是完全不同的事情,这和静态和非静态无关


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

我不明白问题是什么。静态变量不会在不同的进程之间共享。这是一个进程。有两个帧使用相同的静态变量。@Steinar感谢您提供的信息,现在我明白了:-)