我注意到有些时候用Java编写的代码我已经看到了通过方法调用的字段:
System.out.println(object.field);
并按课程:
System.out.println(Class.field);
我的教科书中没有看到任何关于这两种情况的语义是什么的明显区别,我担心,至少对于一个菜鸟来说,这将是一个微妙的观点。我的直觉是类调用将用于静态字段?多谢你们。如此多的con'foo'sion。
答案 0 :(得分:3)
object.field
应该是(请参阅下面的注释)实例成员,而Class.field
将是静态成员。
注意:正如@radai所述,我认为值得一提,你也可以通过一个对象实例访问一个静态成员,但这是一个非常糟糕的做法,这是非常误导。
答案 1 :(得分: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);
答案 2 :(得分:1)
我的直觉是类调用将用于静态字段
仅当SomeClass.field
为field
时才能使用static
。在这种情况下,您也可以通过someClassRef.field
之类的引用访问它,但无论如何编译器都会将此代码更改为ReferenceType.field
。此外,它可能会导致一些误解(可能看起来您正在尝试使用非静态字段),因此最好在其类中使用静态字段。
如果field
不是静态的,那么它必须属于某个实例,因此您必须通过引用someClassRef.field
答案 3 :(得分:1)
可以在不创建类实例的情况下访问字段Class.field
。这些是static
字段,在类加载器加载类时会初始化。
只有在创建类的实例时才能访问其他字段,即object.field
。当通过调用其构造函数创建类的对象时,这些是instance
字段被初始化。
答案 4 :(得分:1)
按类引用字段要求字段为静态字段。
按对象引用字段要求字段可以是静态字段或非静态字段。