繁体   English   中英

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

[英]What is the proper way of accessing static fields in Java?

我刚开始学习Java,并编写了一个使用静态字段进行测试的类。 一切正常,但在Eclipse中,我看到一个图标,将其悬停时显示为:“应该以静态方式访问 CarCounter类型的静态方法getCounter。” 那么正确的方法是什么?

这是课程:

public class CarCounter {
    static int counter = 0;

    public CarCounter(){
        counter++;
    }

    public static int getCounter(){
        return counter;
    }
}

这是我尝试访问变量计数器的地方:

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
    }
}

使用CarCounter.getCounter() 这清楚地表明,这是没有任何关系的对象a变量的值是指-该计数器与类型本身,而不是类型的任何特定实例相关联。

这是为什么它非常重要的示例:

Thread t = new Thread(runnable);
t.start();
t.sleep(1000);

它是什么样的代码是干什么的? 看起来它正在启动一个新线程,然后以某种方式“暂停”它-将其休眠一秒钟。

实际上,它正在启动一个新线程并暂停当前线程,因为Thread.sleep是一个静态方法, 总是使当前线程进入睡眠状态。 不能使任何其他线程休眠。 当它是显式的时,这要清楚得多:

Thread t = new Thread(runnable);
t.start();
Thread.sleep(1000);

基本上,第一段代码的编译能力对于语言设计师来说是一个错误:(

静态字段和方法不属于特定的对象,而是属于一个类,因此您应该从该类而不是对象中访问它们:

CarCounter.getCounter()

并不是

a.getCounter()

那将是:

System.out.println(CarCounter.getCounter());

尽管极力劝阻,但写:

Math m = null;
double d = m.sin(m.PI/4.0);
System.out.println("This should be close to 0.5 " + (d*d));

这是因为静态访问会查看变量的声明类型,而不会真正取消引用它。

静态成员应该静态访问,即ClassName.memberName。 虽然允许非静态访问(objectName.memberName),但不鼓励这样做。

静态元素属于该类。 因此,访问它们的最佳方法是通过类。 因此,在您的情况下,应打印出来。

System.out.println(CarCounter.getCounter());

可能觉得琐碎琐事是不必要的,但不是。 考虑以下代码

// VehicleCounter.java
public class VehicleCounter {
    static int counter = 0;

    public VehicleCounter(){
        counter++;
    }

    public static int getCounter(){
        return counter;
    }
}
// CarCounter.java
public class CarCounter extends VehicleCounter {
    static int counter = 0;

    public CarCounter(){
        counter++;
    }

    public static int getCounter(){
        return counter;
    }
}
// CarCounterTest.java
public class CarCounterTest {
    public static void main( String args[] ){
        VehicleCounter vehicle1 = new VehicleCounter();
        VehicleCounter vehicle2 = new CarCounter();
        System.out.println(vehicle1.getCounter());
        System.out.println(vehicle2.getCounter());
    }
}

上面的代码应该打印什么?

上面的代码的行为很难定义。 vehicle1被声明为VehicleCounter并且该对象实际上是一个VehicleCounter因此它应该打印2(将创建两个车辆)。

vehicle2被声明为VehicleCounter但对象实际为CarCounter 应该打印哪个?

我真的不知道将要打印什么,但是我可以看到它很容易混淆。 因此,为了更好地实践,应该始终通过其定义的类访问静态元素。

通过以下代码可以轻松预测要打印的内容。

// CarCounterTest.java
public class CarCounterTest {
    public static void main( String args[] ){
        VehicleCounter vehicle1 = new VehicleCounter();
        VehicleCounter vehicle2 = new CarCounter();
        System.out.println(VehicleCounter.getCounter());
        System.out.println(CarCounter    .getCounter());
    }
}

希望这能解释。

NawaMan :-D

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM