在Java中访问静态字段的正确方法是什么?

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)

  • 将 *need* 替换为 *should*,因为两行代码都是正确的,但不鼓励使用第二行 (2认同)

Mar*_*oek 8

那将是:

System.out.println(CarCounter.getCounter());
Run Code Online (Sandbox Code Playgroud)