这段代码输出什么,为什么

img


这段代码输出什么,为什么
11111111111111111222222222111111111111

这段代码的输出为:

1 1 2
true false

首先,Java中static关键字修饰的变量是整个类共享的,所以nextId是静态的,其初始值为0。在Exam()构造函数中,每次创建实例时静态变量nextId递增,然后以此为id赋值给该实例的id成员变量。实例方法getld()用于获取该实例的id。

该类同时也有一个静态方法of(),返回类的单例实例。在该方法中,如果从未创建过该类的实例,则创建一个新的实例。否则,返回原来已经创建的实例。

main函数中,首先通过of()方法获取两个实例ele2。由于这两个实例都是通过同一个实例方法of()获取,所以它们具有相同的id值,分别为1和1。

然后创建一个新的实例e3,此时nextId的值为2,因为该实例不是从类的单例实例方法of()获取,所以它的id值为2。

最后,通过==比较三个实例的引用,可以看出ele2引用同一个实例,而e3引用的是另一个实例。因为instance是静态变量,所以它可以被不同的对象所引用。所以输出结果是truefalse

nextId是static的,所有对象共享这个变量,new了两次:一次是调Exam.of()方法的时候,一次是main方法直接new的,所以最终的值是2,e1和e2的值相同都是1,和e3不一样