簡體   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