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

Java 没有弄清楚在这种情况下静态变量是如何工作的,java,Java,我试图理解静态变量是如何工作的,所以如果这个问题是基本的,请提前道歉 我有一个类Employee,它有两个类型为String和初始值为null的公共静态变量 public class Employee { public static String FIRST_NAME = null; public static String LAST_NAME = null; } public class Job { public static Employee EMPLOYEE = nul

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

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

public class Employee {
   public static String FIRST_NAME = null;
   public static String LAST_NAME = null;
}
public class Job {
   public static Employee EMPLOYEE = null;
}
我有另一个类作业,它有1个Employee类型的公共静态变量,初始值为null

public class Employee {
   public static String FIRST_NAME = null;
   public static String LAST_NAME = 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=null

Job.Employee.FIRST\u 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.LAST_NAME=Doe

Job.EMPLOYEE=null

Job.Employee.FIRST_NAME=John

Job.Employee.LAST_NAME=Doe

为什么
Job.EMPLOYEE
为空


感谢阅读我的问题。

类中的变量不应该是静态的。静态意味着该类的所有实例只有一个值。i、 e.每个实例将具有相同的值

您应该使变量非静态(只需删除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");
您可以访问对象的变量,如下所示:

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");
可以按如下方式编辑对象的变量:

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 classes setEmployee方法将Job对象的Employee变量设置为您创建的Employee对象。

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

静态变量在您第一次访问代码中的类时初始化。以下是流程:

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

-employee类设置了其名字和姓氏变量

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

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

-Job.EMPLOYEE为null,但是通过调用静态变量,您调用的是EMPLOYEE.FIRST\u NAME,它是静态的,因此它会在EMPLOYEE类上返回静态变量(不推荐,因为许多其他人都非常清楚地说明了这一点)。您可能期望出现NullReferenceException,但您正在调用的是类而不是实例


希望有帮助

所有这些字段都不应该是静态的,因为这违背了字段的用途,因为它们对于每个员工实例都应该是唯一的。您需要重新阅读Java教科书中的前两章左右的内容,因为这些概念是核心概念,对于您的Java知识的任何进步都是至关重要的。不要这样做
Job.EMPLOYEE.first\u NAME
。您正在通过实例访问类变量。不要通过实例访问类成员。通过实例访问实例成员。这些字段都不应是静态的。撇开这一灾难性的设计错误不谈,您没有指定值,因此它仍然为空。有什么问题吗?假设你是静态概念的新手,这是个好问题。关于为什么Java允许通过实例对象访问静态变量,我还没有找到答案。谢谢。这是一个示例代码,可以让我更好地理解静态变量在引用另一个类时是如何工作的。我的问题是如何使
Job
类中的静态变量
EMPLOYEE
不为空?必须将其设置在某个位置。Job.EMPLOYEE=新员工();静态变量在第一次访问类时初始化,因此您可以在variable@DermitBlair谢谢你告诉我如何正确编码,但我已经知道了。我的问题是一个示例代码,让我更好地理解静态变量在引用另一个类时是如何工作的。您的回答没有回答我的问题。Job.Employee为null,因为您没有为其分配Employee对象。它在Job类中被分配为null,然后在代码中不会发生任何进一步的变化。您需要将其设置为等于Employee对象。谢谢。这是一个示例代码,可以让我更好地理解静态变量在引用另一个类时是如何工作的。我的问题是如何使
Job
类中的静态变量
EMPLOYEE
不为null?静态变量也是变量。只需像这样设置一个值:Job.EMPLOYEE=newemployee();您也可以通过实例访问它,比如newjob()。EMPLOYEE=newemployee();但这只是为了完整性。你不应该用它。