2012-04-26 83 views
-1
對象

面試官問我:定義靜態在Java

class Employee{ 
    private string empname; 

    public String getEmpname() { 
     return empname; 
    } 
    public void setEmpname(String empname) { 
     this.empname = empname; 
    } 
} 

class EmpDetails{  
    private static Employee emp; 
    public static List fillData(){ 
     emp=new Employee(); 
     List l=new ArrayList(); 
     System.out.println("static after new creation fillData"+System.identityHashCode(emp)); 
     emp.setEmpname("suresh"); 
     emp.setDesignation("Sr.Software Engineer"); 
     l.add(emp); 
     emp=new Employee(); 
     System.identityHashCode(emp); 
     System.out.println("static after new creation fillData"+System.identityHashCode(emp)); 
     emp.setEmpname("Prasad"); 
     emp.setDesignation("Software Engineer"); 
     l.add(emp); 
     return l;  
    } 
} 

如果定義如下

private static Employee emp; 

會發生什麼有什麼優勢與定義與員工的靜態和非靜態的非接入改性劑目的?

+1

可能重複[在Java中靜態字段的確切含義是什麼?](http://stackoverflow.com/questions/797964/what-is-the-exact-meaning-of-static-fields-in- java) – Thilo 2012-04-26 04:23:20

回答

2

如果一個字段被定義爲static,那麼該字段的值由該特定類的所有實例共享。就你的情況而言,該領域被定義爲私有的,這會限制類的實例在類之外訪問它。當你的fill dataget()調用它時將創建Employee列表,並且static emp字段將保存最後一個emp(「Prasad」)的值。如果創建了類EmpDetails的任何其他實例,並且嘗試訪問emp而不調用fillData,則可以使用其他方法,例如GetEmp(),那麼它將返回設置爲「Prasad」的emp的最後一個值。
關於設計,這種方法不正確,因爲由於靜態Employee對象,EmpDetails類將指向一個Employee。

+0

我不確定,但它可以幫助記憶利用?如果Employee的多個對象將佔用多個內存位置。在這種情況下,它將佔用單個內存位置... 我是對還是錯? – Ketan 2012-04-26 04:36:33

+0

當我用emp對象迭代列表。我得到了suresh和prasad值輸出是大小======= 2 大小======= suresh 大小======= Prasad – user1357722 2012-04-26 04:38:28

+0

@ user1357722,是的,你會得到兩個值的列表,但嘗試獲得emp字段值,這將返回Prasad只,而不是suresh,它將爲所有的EmployeeDetails實例類 – Habib 2012-04-26 04:48:52

0

如果您在EmpDetails類中定義了一個靜態Employee成員字段 - 這意味着所有EmpDetails實例共享相同的Employee實例。沒有更多的上下文,你的問題的其餘部分沒有多少意義。

+0

是的。設計共享的正確方法Muliptple EmpDetails實例使用相同的員工實例。 – user1357722 2012-04-26 04:29:45

0

你應該考慮到通過在主題閱讀Oracle's tutorial實例變量類變量,例如之間的差異讀了。