为什么单例静态方法getNext()返回递增的值

ble*_*one 1 java singleton design-patterns

我有一个带有静态方法的单例类 getNext()

public class Sequence {

   private static Sequence  instance;
   private static int counter;

   private Sequence () { // note: private constructor
      counter = 0;
   }

   public static Sequence getInstance(){
      if(instance==null) { // Lazy instantiation
         instance = new Sequence(); 
      }
      return instance;
   }

   public static int getNext(){ return ++counter;}
}
Run Code Online (Sandbox Code Playgroud)

在我的测试代码中,我有一个for循环,它调用getNext()了几次

public class TestSequence {
   public static void main(String[] args) {
      for (int i = 0; i < 5; i++)
         System.out.println(Sequence.getNext());        
   }
Run Code Online (Sandbox Code Playgroud)

}

它的输出是

1
2
3
4
5
Run Code Online (Sandbox Code Playgroud)

这是为什么?根据我的理解,static我认为输出总是如此1.

我理解使用static方法,不需要创建类(对象)的实例.如果未创建对象,则每次调用静态getNext()方法都应增加新的(虚拟)实例变量counter = 0并返回它.

但是我的程序与非静态方法的行为方式完全相同.为什么?可能我误解了一些东西或简化了一些事情.

Era*_*ran 7

每次调用static getNext()方法都应该增加新的(虚拟)实例变量counter = 0并返回它

不,静态变量(原样counter)是一个类变量,这意味着它只有一个实例,因此每次调用静态方法时相同的变量都会递增.

如果counter不是静态的,您将获得预期的行为,并且您更改getNext()为创建新Sequence实例:

public static int getNext(){
    Sequence seq = new Sequence ();
    seq.counter += 1;
    return seq.counter;
}
Run Code Online (Sandbox Code Playgroud)

但那时Sequence不会是一个单身人士.