我试图理解静态变量是如何工作的,如果这个问题是基本的话,请提前道歉。
我有一个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
为空?
感谢您阅读我的问题。
答案 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,但您正在进行的调用是在类而不是实例上。
希望有所帮助!