[英]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);
我的直觉是,类调用将用于静态字段
是的,仅当field
为static
时才可以使用SomeClass.field
。 在这种情况下,您也可以通过诸如someClassRef.field
引用来访问它,但是无论如何,编译器都会将此代码更改为ReferenceType.field
。 它还可能引起一些误解(似乎您正在尝试使用非静态字段),因此最好按类使用静态字段。
如果field
不是静态的,则它必须属于某个实例,因此您必须通过引用someClassRef.field
进行调用
可以在不创建类实例的情况下访问Class.field
字段。 这些是static
字段,当类加载器加载类时会初始化这些static
字段。
仅当创建类的实例时,才能访问另一个字段,即object.field
。 这些是在通过调用类的构造函数创建类的对象时初始化的instance
字段。
按类刷新字段要求该字段是静态的。
按对象刷新字段要求该字段可以是静态字段,也可以是非静态字段。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.