0

我注意到在 Java 中编码时,有时我会看到方法调用的字段:

System.out.println(object.field);

并按班级:

System.out.println(Class.field);

我在教科书中没有看到任何关于这两种情况的语义的明确区分,我担心这将是,至少对于菜鸟来说,这是一个微妙的点。我的直觉是类调用将用于静态字段?多谢你们。这么多的con'foo'sion。

4

5 回答 5

3

object.field应该是(见下面的注释)一个实例成员,而Class.field应该是一个静态成员。

注意:正如@radai 所说,我认为值得一提的是,您还可以通过对象实例访问静态成员,但这是一种非常糟糕的做法,非常容易产生误导。

于 2013-10-17T03:08:28.787 回答
1

实例范围与类范围。

看一下这个:

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);
于 2013-10-17T03:09:31.210 回答
1

我的直觉是类调用将用于静态字段

Yes只有在isSomeClass.field时才能使用。在这种情况下,您也可以通过引用访问它,但无论如何编译器都会将这段代码更改为。此外,它可能会引起一些误解(您似乎正在尝试使用非静态字段),因此最好按其类使用静态字段。fieldstaticsomeClassRef.fieldReferenceType.field

如果field不是静态的,那么它必须属于某个实例,因此您必须通过引用调用它someClassRef.field

于 2013-10-17T03:09:32.313 回答
1

Class.field无需创建类的实例即可访问该字段。这些是static在类加载器加载类时初始化的字段。

其他字段 ieobject.field只有在创建类的实例时才能访问。这些instance是在通过调用其构造函数创建类的对象时初始化的字段。

于 2013-10-17T03:13:27.967 回答
1

按类引用字段要求该字段是静态的。

按对象引用字段要求字段可以是静态或非静态字段。

于 2013-10-17T03:13:30.160 回答