繁体   English   中英

在这种情况下无法弄清楚静态变量的工作方式

[英]Not figuring out how the static variable is working in this case

如果这个问题很简单,我想事先了解一下静态变量是如何工作的。

我有一个Employee类,它具有2个公共静态变量,其类型均为String且初始值为null。

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

我还有另一个Job类,它有1个类型为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 =空

Employee.LAST_NAME =空

Job.EMPLOYEE =空

Job.Employee.FIRST_NAME =空

Job.Employee.LAST_NAME =空

然后,我将值分配给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 =约翰

Employee.LAST_NAME = Doe

Job.EMPLOYEE =空

Job.Employee.FIRST_NAME =约翰

Job.Employee.LAST_NAME = Doe

为什么Job.EMPLOYEE为空?

感谢您阅读我的问题。

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

您的类中的变量不应为静态。 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对象。

静态变量在您首次访问代码中的类时被初始化。 流程如下:

-Main方法运行并从第一行开始

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

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

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

-Job.EMPLOYEE为null,但是通过调用静态变量,您正在调用Employee.FIRST_NAME,该变量是静态的,因此它返回Employee类上的静态变量(不建议这样做,因为很多其他人都非常清楚地指出了这一点。)您可能已经期望了NullReferenceException ,但是您要进行的调用是在类上,而不是在实例上。

希望有帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM