试图理解静态是java,为什么这是代码中的输出?
输出:试图理解静态是java,为什么这是代码中的输出?,java,static,Java,Static,输出: class Cup { Cup(int marker) { System.out.println("Cup(" + marker + ")"); } void f(int marker) { System.out.println("f(" + marker + ")"); } } class Cups { static Cup c1; static Cup c2; static { c1 = new Cup(1); c2
class Cup {
Cup(int marker) {
System.out.println("Cup(" + marker + ")");
}
void f(int marker) {
System.out.println("f(" + marker + ")");
}
}
class Cups {
static Cup c1;
static Cup c2;
static {
c1 = new Cup(1);
c2 = new Cup(2);
}
Cups() {
System.out.println("Cups()");
}
}
public class ExplicitStatic {
static Cups x = new Cups();
static Cups y = new Cups();
public static void main(String[] args) {
System.out.println("Inside main()");
}
}
所以有两个静态的杯子,
在课堂上,为什么它只显示
Cup(1)和&Cup(2)?因为
静态变量将初始化一次。调用新Cup()
的唯一时间是在Cups
的静态初始化程序块内
无论您创建了多少个Cups
实例,只要您强制初始化Cups
类(例如,通过对其调用静态方法),这都只会执行一次
如果每个Cups
实例需要两个Cup
实例,则应使用实例字段,例如
Cup(1)
Cup(2)
Cups()
Cups()
Inside main()
然后您将得到以下输出:
class Cups {
Cup c1 = new Cup(1);
Cup c2 = new Cup(2);
Cups() {
// This will execute *after* the field initializers above
System.out.println("Cups()");
}
}
java允许您在类中的特殊“静态子句”(有时称为静态块)中对其他静态初始化进行分组
在代码中
Cup(1)
Cup(2)
Cups()
Cup(1)
Cup(2)
Cups()
Inside main()
将只执行一次:
第一次创建该类的对象时,或者第一次访问该类的静态成员时,即使从未创建过该类的对象。您是否希望Cup(1)Cup(2)
打印两次?是的,就像main()中的Cup(1)Cup(2)Cups()Cups(1)Cups(2)Cups(),那么您为什么希望这样呢?您有两个静态Cup
字段,每个字段初始化一次。我的回答对你有意义吗?如果我理解的话,c1和c2已经在一个静态块中初始化。。所以每次创建一个新的Cups对象时都会共享它?这是否解释了为什么Cup只有两个实例?这不是因为它是共享的,而是因为它不是特定于任何特定实例的-如果您只是在Cups
中调用一个静态方法,而从不创建Cups
的任何实例,那么您仍然会得到Cup
的这两个实例。静态变量(和方法)与该类型关联,而不是与该类型的任何特定实例关联。感谢您的解释,那么在我的代码中调用了哪个静态变量?是x还是y?哪一个被忽略了?但是静态cups x和静态cups y不是创建了一个不同的Cup实例吗?@javanob不同的cups是的。但所有实例的静态变量都是相同的。
static {
c1 = new Cup(1);
c2 = new Cup(2);
}