[英]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.