我有一段Java代码,我很难理解代码是如何工作的。
关于它最令人尴尬的是,我实际上知道自从我使用Blue-J以来它打印出来的内容,我也做了解决方法以了解这段代码是如何工作的,但我仍然不明白代码有效,如果你理解它,请一步一步解释,提前谢谢,无论如何这是我的代码:
public class T13 {
private static int s = 1;
private int id;
T13() {
id = s;
s++;
}
public static void main(String[] args) {
T13 t1 = new T13();
System.out.println("t1: " + t1.id + ", " + t1.s);
T13 t2 = new T13();
System.out.println("t2: " + t2.id + ", " + t2.s);
}
}
它打印出以下内容:
t1: 1, 2
t2: 2, 3
答案 0 :(得分:3)
不确定。 T13持有静态成员s,首先用1初始化。
静态类变量是该类的所有实例共享的变量。也就是说,每次创建T13实例变量时(例如代码中的新T13()),成员s都是相同的内存位置,并由所有T13共享。
在实际创建任何T13实例之前,只运行一次静态初始化。
因此,在你的第一个T13 t1 =新T13()之前,s被设置为1.然后你进入创建者,其中仍然是1,id设置为s,所以它是1,ans s增加到2
下一个新的T13()找到s为2,id设置为2,s增加为3.因此你的结果。
希望它有所帮助。
答案 1 :(得分:1)
现在你知道为什么,阅读你的代码的任何人都会感到困惑:
System.out.println("t1: " + t1.id + ", " + t1.s);
System.out.println("t2: " + t2.id + ", " + t2.s);
在t1.s
和t2.s
两种情况下都是T13.s
的实际引用
因而如下:
System.out.println("t1: " + t1.id + ", " + T13.s);
这是因为:
private static int s = 1;
属于每个实例共享的Class
,只有一个s
,所有类型为T13
的实例共享,或者从T13
继承
static
成员应谨慎使用,static final
首选private static final AtomicInteger S = new AtomicInteger();
是Class
级别计数器的首选实现。这样就是线程安全的。
此外,static final
成员更容易推理并且是线程安全的。
然后在你的构造函数中你会这样做:
T13() { this.id = T13.S.getAndIncrement(); }
不用担心并发问题
Java样式指南约定规定任何static final
成员都应ALL_UPPER_CASE
,以帮助他们与instance
成员区别开来。
private static final AtomicInteger S = new AtomicInteger(1);
private int id;
将static final
成员命名为惯用法。这样做表明您了解Java约定,并有助于使这些特殊情况在您的代码中脱颖而出。