У меня есть образец проекта как доказательство концепции переменной класса (статический). Но когда я запускаю два экземпляра класса StaticCounter.java
, общая переменная (статическая) даст двум экземплярам разные ссылки? !!.Концепция переменной статического класса не работает?
Static Variable Documentation:
- переменные класса (статические поля) Переменная класса является любое поле объявляется с помощью статического модификатора; это говорит компилятору, что существует только одна копия этой переменной в существовании, независимо от того, сколько раз экземпляр класса был создан. Поле, определяющее количество передач для определенного вида велосипеда, может быть помечено как статическое, так как концептуально одинаковое количество передач будет применяться ко всем экземплярам. Код 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
Это ОДИН процесс. Существует два кадра, которые используют одну и ту же статическую переменную. – mentallurg