2012-04-26 56 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实例变量类变量,例如之间的差异读了。