我开发了示例项目作为类变量(静态)的证明概念。但是当我运行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);
}
});
}
}
那么,为什么?!
答案 0 :(得分:0)
在这个例子中
@Override
public void run() {
new StaticCounter().setVisible(true);
}
因为你只有一个StaticCounter
对象,所以没什么可看的。单击Counter++
按钮时,值会增加。好'直到这里?
在这一个
@Override
public void run() {
new StaticCounter().setVisible(true);
new StaticCounter().setVisible(true);
}
更容易看到static
行为。当您点击其中一个JFrame
的{{1}}按钮时,您会看到值上升。显然它不会改变其他窗口,因为你没有重绘它,但是如果你点击另一个按钮,你会看到下一个值继续从Counter++
计数器所在的位置开始。这证明JVM中只有一个计数器实例。
答案 1 :(得分:0)
静态变量在您的代码中运行。如果单击一帧中的按钮并将其显示在另一帧中,则会显示正确的递增值。如果你想自动更新UI,那就完全不同了,这与静态或非静态无关。
如果您有疑问,只需在方法doCount()
中添加登录。然后你会看到计数器正确改变,蚂蚁说这是所有帧的同一个caounter。所以静态没有问题。