[英]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.