[英]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.