enc*_*nce 1 java variables static class
我刚开始学习Java,我写了一个类来测试使用静态字段.一切正常但在Eclipse中我看到一个图标,当它悬停时出现:"应该以静态方式访问 CarCounter类型的静态方法getCounter ." 什么是正确的方式呢?
这是班级:
public class CarCounter {
static int counter = 0;
public CarCounter(){
counter++;
}
public static int getCounter(){
return counter;
}
}
Run Code Online (Sandbox Code Playgroud)
这是我尝试访问变量计数器的地方:
public class CarCounterTest {
public static void main( String args[] ){
CarCounter a = new CarCounter();
System.out.println(a.getCounter()); //This is where the icon is marked
}
}
Run Code Online (Sandbox Code Playgroud)
Jon*_*eet 16
使用CarCounter.getCounter()
.这清楚地表明它与a
变量值引用的对象无关- 计数器与类型本身相关联,而不是与类型的任何特定实例相关联.
这是一个为什么它非常重要的例子:
Thread t = new Thread(runnable);
t.start();
t.sleep(1000);
Run Code Online (Sandbox Code Playgroud)
这是什么看起来像代码是干什么的?看起来它正在开始一个新的线程,然后以某种方式"暂停" - 将其发送到睡眠状态一秒钟.
实际上,它正在启动一个新线程并暂停当前线程,因为它Thread.sleep
是一个静态方法,它总是让当前线程休眠.它不能使任何其他线程睡眠.当它明确时,它会更加清晰:
Thread t = new Thread(runnable);
t.start();
Thread.sleep(1000);
Run Code Online (Sandbox Code Playgroud)
基本上,第一段代码编译的能力是语言设计者的一个错误:(
MBy*_*ByD 11
静态字段和方法不属于特定对象,而是属于某个类,因此您应该从类中访问它们,而不是从对象访问它们:
CarCounter.getCounter()
Run Code Online (Sandbox Code Playgroud)
并不是
a.getCounter()
Run Code Online (Sandbox Code Playgroud)