我注意到有时在 Java 中编码时,我会看到由方法调用的字段:
System.out.println(object.field);
按类别:
System.out.println(Class.field);
在我的教科书中,我没有看到任何关于这两种情况的语义的明确区别,我担心这将是一个微妙的点,至少对于一个菜鸟来说。我的直觉是类调用将用于静态字段? 谢谢大家。这么多的骗局。
object.field
应该是(见下面的注释)实例成员,而Class.field
是静态成员。
注意:正如@radai所说,我认为值得一提的是,您也可以通过对象实例访问静态成员,但这是一个非常糟糕的做法,具有很大的误导性。
创建类的实例即可访问字段Class.field
。这些是static
字段,当类装入器装入类时初始化这些字段。
另一个领域,即 只有在创建类的实例时才能访问object.field
。这些是通过调用其构造函数创建类的对象时初始化instance
字段。
实例作用域与类作用域。
看看这个:
class Foobar {
public final int x = 5;
public static final int y = 6;
}
y
是在编译时只创建一次的变量。它绑定到类,因此由其所有实例共享。你用Foobar.y
引用这个.
System.err.println(Foobar.y);
另一方面,x
是一个实例变量,您使用new
创建的每个Foobar
都将具有它的副本。您可以像这样引用它:
Foobar foobar = new Foobar();
System.err.println(foobar.x);
但这行不通:
System.err.println(Foobar.x);
按类重新引用字段需要该字段是静态的。
按对象重新引用字段要求该字段可以是静态字段,也可以是非静态字段。
我的直觉是类调用将用于静态字段
是的,SomeClass.field
只有在field
static
的情况下才能使用。在这种情况下,您也可以通过引用(如someClassRef.field
)访问它,但编译器无论如何都会将此代码更改为ReferenceType.field
。它也可能导致一些误解(看起来您正在尝试使用非静态字段),因此最好按其类使用静态字段。
如果field
不是静态的,那么它必须属于某个实例,所以你必须通过引用来调用它someClassRef.field