另外,提供以下方法-
用于初始化名稱和年齡的參數化構造函數。ID 應在此構造函數中初始化。
顯示 ID、姓名和年齡的方法 show()。
顯示下一個員工的 ID 的方法 showNextId()。
現在對垃圾回收機制不了解的初學者可能會這樣編寫代碼:
//計算在公司工作的員勞工數的程式
class Employee
{
private int ID;
private String name;
private int age;
private static int nextId=1;
//它是靜态的,因為它在所有對象之間保持通用并由所有對象共享
public Employee(String name,int age)
{
this.name = name;
this.age = age;
this.ID = nextId++;
}
public void show()
{
System.out.println
("Id="+ID+"\nName="+name+"\nAge="+age);
}
public void showNextId()
{
System.out.println
("Next employee id will be="+nextId);
}
}
class UseEmployee
{
public static void main(String []args)
{
Employee E=new Employee("GFG1",33);
Employee F=new Employee("GFG2",45);
Employee G=new Employee("GFG3",25);
E.show();
F.show();
G.show();
E.showNextId();
F.showNextId();
G.showNextId();
{ //這是保留所有實習生的子塊。
Employee X=new Employee("GFG4",23);
Employee Y=new Employee("GFG5",21);
X.show();
Y.show();
X.showNextId();
Y.showNextId();
}
//這個大括号之後,X 和 Y 将被移除。是以現在它應該顯示 nextId 為 4。
E.showNextId();//這一行的輸出應該是 4,但它會給出 6 作為輸出。
}
}
輸出:
現在獲得正确的輸出:
現在垃圾收集器(gc)将看到 2 個空閑的對象。現在遞減 nextId,gc(garbage collector) 隻會在我們的程式員在我們的類中覆寫它時調用方法 finalize() 。如前所述,我們必須請求 gc(garbage collector),為此,我們必須在關閉子塊的大括号之前編寫以下 3 個步驟。
将引用設定為 null(即 X = Y = null;)
調用,System.gc();
調用,System.runFinalization();
現在計算員勞工數的正确代碼(不包括實習生)
// 計算不包括實習生的員勞工數的正确代碼
class Employee
{
private int ID;
private String name;
private int age;
private static int nextId=1;
//它是靜态的,因為它在所有對象之間保持通用并由所有對象共享
public Employee(String name,int age)
{
this.name = name;
this.age = age;
this.ID = nextId++;
}
public void show()
{
System.out.println
("Id="+ID+"\nName="+name+"\nAge="+age);
}
public void showNextId()
{
System.out.println
("Next employee id will be="+nextId);
}
protected void finalize()
{
--nextId;
//在這種情況下,gc 會為 2 個對象調用 finalize() 兩次。
}
}
// 它是 Employee 類的右括号
class UseEmployee
{
public static void main(String []args)
{
Employee E=new Employee("GFG1",33);
Employee F=new Employee("GFG2",45);
Employee G=new Employee("GFG3",25);
E.show();
F.show();
G.show();
E.showNextId();
F.showNextId();
G.showNextId();
{
//這是保留所有實習生的子塊。
Employee X=new Employee("GFG4",23);
Employee Y=new Employee("GFG5",21);
X.show();
Y.show();
X.showNextId();
Y.showNextId();
X = Y = null;
System.gc();
System.runFinalization();
}
E.showNextId();
}
}