我正在阅读Bruce Eckel撰写的“Thinking in Java”一书,我遇到了一个代码片段,我或多或少地理解,但想要修改。实际上,代码的目的是表明类静态变量只被实例化一次,并且在调用所述类的构造函数方法之前。
以下是关于repl.it (我添加了评论):https://repl.it/Bhct/6的图书代码的链接,我将在下面发布它及其结果:
class Main {
public static void main(String[] args) {
System.out.println("Inside main()");
Cups.c1.f(99);
}
// Want to initialize a counter int here
// static int counter = 1;
// Want to pass counter to Cups constructor here:
// static Cups x = new Cups(counter);
static Cups x = new Cups();
// counter++;
// static Cups x = new Cups(counter);
static Cups y = new Cups();
// counter++;
// static Cups x = new Cups(counter);
static Cups z = new Cups();
}
class Cup {
Cup(int marker) {
System.out.println("Cup("+ marker +")");
}
void f(int marker) {
System.out.println("f(" + marker + ")");
}
}
class Cups {
int counter = 1;
static Cup c1;
static Cup c2;
static {
c1 = new Cup(1);
c2 = new Cup(2);
}
// Want to pass an arg to Cups() like this:
// Cups(int counter) {
// System.out.println("Cups() constructor #" + counter);
// }
Cups() {
System.out.println("Cups()");
}
}
结果
Cup(1)
Cup(2)
Cups()
Cups()
Cups()
Inside main()
f(99)
我想要做的是编辑Cups()
构造函数的日志以包含一个表示它们被调用顺序的计数器,即:
Cup(1)
Cup(2)
Cups() 1
Cups() 2
Cups() 3
Inside main()
f(99)
请参阅我的评论,我认为可以这样做。在main中定义静态变量并通过调用counter++
递增它不起作用,因为期望“”。但是,我以为我早先将计数器声明为int?
我尝试过这方面的一些变化,比如将增量作为主要内部和外部的方法,但我没有运气。
我在这里缺少什么主要的Java概念?
我提前为这个问题的措辞道歉。不完全确定如何提出这个问题。
答案 0 :(得分:1)
你的方法是正确的,但你必须在杯子里让你的反击静止:
class Cups {
static int counter = 1;
static Cup c1;
static Cup c2;
static {
c1 = new Cup(1);
c2 = new Cup(2);
}
Cups() {
System.out.println("Cups() constructor #" + counter);
counter++;
}
}
原因是所有Cups实例共用同一个计数器。如果他们有每个一个单独的计数器,那么对于每个Cups实例,它将是1。通过使计数器静态,所有实例都会增加相同的变量。
这是更快的解决方案。这是另一种方式,需要对代码进行更多更改,但实际上更类似于您的方法(如您所愿):
class Main {
public static void main(String[] args) {
System.out.println("Inside main()");
Cups.c1.f(99);
}
static int counter = 1;
// Want to pass counter to Cups constructor here:
static Cups x = new Cups(counter);
// Want to increment that counter here
static Cups y = new Cups(counter);
// Want to increment that counter here
static Cups z = new Cups(counter);
}
Cups(int counter) {
System.out.println("Cups() constructor #" + counter);
Main.counter++;
}
您需要Main.counter
引用计数器。