这段代码的输出为:
1 1 2
true false
首先,Java中static
关键字修饰的变量是整个类共享的,所以nextId
是静态的,其初始值为0。在Exam()
构造函数中,每次创建实例时静态变量nextId
递增,然后以此为id赋值给该实例的id
成员变量。实例方法getld()
用于获取该实例的id。
该类同时也有一个静态方法of()
,返回类的单例实例。在该方法中,如果从未创建过该类的实例,则创建一个新的实例。否则,返回原来已经创建的实例。
在main
函数中,首先通过of()
方法获取两个实例el
和e2
。由于这两个实例都是通过同一个实例方法of()
获取,所以它们具有相同的id值,分别为1和1。
然后创建一个新的实例e3
,此时nextId
的值为2,因为该实例不是从类的单例实例方法of()
获取,所以它的id值为2。
最后,通过==
比较三个实例的引用,可以看出el
和e2
引用同一个实例,而e3
引用的是另一个实例。因为instance
是静态变量,所以它可以被不同的对象所引用。所以输出结果是true
、false
。
nextId是static的,所有对象共享这个变量,new了两次:一次是调Exam.of()方法的时候,一次是main方法直接new的,所以最终的值是2,e1和e2的值相同都是1,和e3不一样