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