2013-09-30 3 views
-1

У меня есть образец проекта как доказательство концепции переменной класса (статический). Но когда я запускаю два экземпляра класса 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); 
     } 
    }); 
} 
} 

Итак, почему ?!

+0

Я не понимаю, в чем проблема. –

+0

Статические переменные не разделяются между различными процессами. – Steinar

+0

Это ОДИН процесс. Существует два кадра, которые используют одну и ту же статическую переменную. – mentallurg

ответ

0

В этом примере

@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 имеется только один экземпляр счетчика.

0

Статическая переменная РАБОТАЕТ в вашем коде. Если вы нажмете кнопку в одном кадре и отобразите ее в другой, она отобразит правильные добавочные значения. Если вы хотите автоматически обновлять пользовательский интерфейс, это совсем другое дело, это не имеет никакого отношения к статическому или не статическому.

Если у вас есть сомнения, просто добавьте регистрацию в метод doCount(). Затем вы увидите, что счетчик изменяется правильно, и это то же самое для всех фреймов. Таким образом, нет проблемы со статикой.

Смежные вопросы