按类引用字段和按对象调用字段有什么区别



我注意到有时在 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

最新更新