[英]Final and Static Final usage in Java
這來自“ Java思維”中“恢復類”一章的Ex18。 代碼如下:
public class E18 {
public static void main(String[]args)
{
System.out.println("First object:");
System.out.println(new WithFinalFields());
System.out.println("First object:");
System.out.println(new WithFinalFields());
}
}
class SelfCounter{
private static int count;
private int id=count++;
public String toString()
{
return "self counter"+id;
}
}
class WithFinalFields
{
final SelfCounter selfCounter=new SelfCounter();
static final SelfCounter scsf=new SelfCounter();
public String toString()
{
return "selfCounter="+selfCounter+"\nscsf="+scsf;
}
}
代碼的輸出為:
First object:
selfCounter=self counter1
scsf=self counter0
First object:
selfCounter=self counter2
scsf=self counter0
我能理解為什么在這兩次運行中,由於聲明為final和static字段,因此scsf實例始終將ID分配為0。 令我感到困惑的是為什么將“ selfCounter”對象的id分別指定為1和2,我對如何基於另一個靜態實例變量“ count”進行id的計算有些困惑。
感謝您的指導。
ID為1和2,因為您要創建三個 SelfCounter對象,所有這些對象共享相同的計數字段,該字段隱式初始化為零。
第一個是WithFinalFields中的靜態SelfCounter。 它的ID為零,因為count字段被隱式初始化為零,而count ++的值為零。
第二個ID為1,因為count ++的值為1。 然后,第三個ID為2,因為count ++的值為2。
變量private static int count;
是靜態變量,啟動程序時它將具有0值,並且不會重新創建。 private int id=count++;
是動態變量。
在創建SelfCounter()
類的新實例時,有3種情況:1,因為該行的static final SelfCounter scsf=new SelfCounter();
,第一次啟動new WithFinalFields()
時返回1,第二次啟動new WithFinalFields()
時返回1。 因此, WithFinalFields()
的第一次和第二次啟動期間的值將分別為1和2。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.