Java 没有弄清楚在这种情况下静态变量是如何工作的
我试图理解静态变量是如何工作的,所以如果这个问题是基本的,请提前道歉 我有一个类Employee,它有两个类型为String和初始值为null的公共静态变量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
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();但这只是为了完整性。你不应该用它。