簡體   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