繁体   English   中英

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

[英]What is the difference between referencing a field by class and calling a field by object?

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

System.out.println(object.field);

并按类别:

System.out.println(Class.field);

我在教科书中没有看到关于这两种情况的语义的明显区别,而且我担心,至少对于新手来说,这将是一个微妙的问题。 我的直觉是类调用将用于静态字段? 多谢你们。 这么多的欺骗。

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是一个实例变量,并且您用new创建的每个Foobar都会有一个副本。 您可以这样引用它:

Foobar foobar = new Foobar();
System.err.println(foobar.x);

但这不起作用:

System.err.println(Foobar.x);

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

是的,仅当fieldstatic时才可以使用SomeClass.field 在这种情况下,您也可以通过诸如someClassRef.field引用来访问它,但是无论如何,编译器都会将此代码更改为ReferenceType.field 它还可能引起一些误解(似乎您正在尝试使用非静态字段),因此最好按类使用静态字段。

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

可以在不创建类实例的情况下访问Class.field字段。 这些是static字段,当类加载器加载类时会初始化这些static字段。

仅当创建类的实例时,才能访问另一个字段,即object.field 这些是在通过调用类的构造函数创建类的对象时初始化的instance字段。

按类刷新字段要求该字段是静态的。

按对象刷新字段要求该字段可以是静态字段,也可以是非静态字段。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM