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

时间:2013-10-17 03:05:06

标签: java object reference field

我注意到有些时候用Java编写的代码我已经看到了通过方法调用的字段:

System.out.println(object.field);

并按课程:

System.out.println(Class.field);

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

5 个答案:

答案 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.fieldfield时才能使用static。在这种情况下,您也可以通过someClassRef.field之类的引用访问它,但无论如何编译器都会将此代码更改为ReferenceType.field。此外,它可能会导致一些误解(可能看起来您正在尝试使用非静态字段),因此最好在其类中使用静态字段。

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

来调用它

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

按类引用字段要求字段为静态字段。

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