在这种情况下,没有弄清楚静态变量是如何工作的

时间:2015-03-13 21:34:05

标签: java

我试图理解静态变量是如何工作的,如果这个问题是基本的话,请提前道歉。

我有一个Employee类,它有两个类型为String且初始值为null的公共静态变量。

public class Employee {
   public static String FIRST_NAME = null;
   public static String LAST_NAME = null;
}

我有另一个类Job,它有一个Employee类型的公共静态变量,初始值为null。

public class Job {
   public static Employee EMPLOYEE = null;
}

我创建了一个单独的类来打印出初始值。

public class Testing {
   public static void main(String[] args) {
      System.out.println("Employee.FIRST_NAME=" + Employee.FIRST_NAME);
      System.out.println("Employee.LAST_NAME=" + Employee.LAST_NAME);
      System.out.println("Job.EMPLOYEE=" + Job.EMPLOYEE);
      System.out.println("Job.EMPLOYEE.FIRST_NAME=" + Job.EMPLOYEE.FIRST_NAME);
      System.out.println("Job.EMPLOYEE.LAST_NAME=" + Job.EMPLOYEE.LAST_NAME);
   }
}

这就是输出:

  

Employee.FIRST_NAME = null

     

Employee.LAST_NAME = null

     

Job.EMPLOYEE =空

     

Job.Employee.FIRST_NAME = null

     

Job.Employee.LAST_NAME = null

然后我将值赋给Employee类的静态变量。然后我再次打印出两个类的所有值。

public class Testing {
   public static void main(String[] args) {
      Employee.FIRST_NAME = "John";
      Employee.LAST_NAME = "Doe";
      System.out.println("Employee.FIRST_NAME=" + Employee.FIRST_NAME);
      System.out.println("Employee.LAST_NAME=" + Employee.LAST_NAME);
      System.out.println("Job.EMPLOYEE=" + Job.EMPLOYEE);
      System.out.println("Job.EMPLOYEE.FIRST_NAME=" + Job.EMPLOYEE.FIRST_NAME);
      System.out.println("Job.EMPLOYEE.LAST_NAME=" + Job.EMPLOYEE.LAST_NAME);
   }
}

这就是输出:

  

Employee.FIRST_NAME = John

     

Employee.LAST_NAME = Doe

     

Job.EMPLOYEE =空

     

Job.Employee.FIRST_NAME = John

     

Job.Employee.LAST_NAME = Doe

为什么Job.EMPLOYEE为空?

感谢您阅读我的问题。

3 个答案:

答案 0 :(得分:2)

我希望代码只是一个例子。如果不是:您不应该以这种方式使用静态变量,因为它们对于同一运行时中的所有类的实例都是全局的(它实际上是类/子类的所有实例的一个变量)。 Job.EMPLOYEE仍为null,因为您尚未为其分配值。

答案 1 :(得分:1)

类中的变量不应该是静态的。 static表示该类的所有实例只有一个值。即每个实例都具有相同的值。

您应该使变量非静态(只需删除static关键字)。

您还应该将它们设为私有,并为它们提供访问器方法,例如getter和setter。您还可以创建一个构造函数,该构造函数接受将为您创建类的对象的名字和姓氏。

例如:

public class Employee {

private String firstName = null;
private String lastName = null;

public Employee(String firstName, String lastName)
{
    this.firstName = firstName;
    this.lastName = lastName;
}

public String getFirstName()
{
    return firstName;
}

public void setFirstName(String firstName)
{
    this.firstName = firstName;
}
public String getLastName()
{
    return lastName ;
}
public void setLastName(String lastName)
{
    this.lastName = lastName ;
}

}

然后您可以像这样创建Employee对象:

Employee employee1 = new Employee("Joe", "Bloggs");
Employee employee2 = new Employee("John", "Smith");

您可以像这样访问对象的变量:

System.out.println("Employee 1 first name: " + employee1.getFirstName());
System.out.println("Employee 1 last name: " + employee1.getLastName());

您可以像这样编辑对象的变量:

employee1.setFirstName("Adam");

然后对Job类执行相同操作,并使用Job类setEmployee方法将Job对象的Employee变量设置为等于您创建的Employee对象。

答案 2 :(得分:1)

第一次访问代码中的类时,会初始化静态变量。这是流程:

- 主要方法在第一行运行并开始

- 员工类的名字和姓氏变量设置

- 第一和第二个打印行语句访问这些​​变量

- 未设置employee变量,因此值为null

- Job.EMPLOYEE为null,但通过调用静态变量,您调用的是Employee.FIRST_NAME,这是静态的,因此它返回Employee类的静态变量(不推荐其他许多人非常清楚地说明。)您可能有预期会出现NullReferenceException,但您正在进行的调用是在类而不是实例上。

希望有所帮助!