执行以下程序/ JAVA后打印的内容是什么?

时间:2014-02-19 21:33:00

标签: java

我有一段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

2 个答案:

答案 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.st2.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样式指南约定

Java样式指南约定规定任何static final成员都应ALL_UPPER_CASE,以帮助他们与instance成员区别开来。

private static final AtomicInteger S = new AtomicInteger(1);
private int id;

static final成员命名为惯用法。这样做表明您了解Java约定,并有助于使这些特殊情况在您的代码中脱颖而出。