2012-01-24 77 views
-5
import java.util.*; 

public class Test { 
    public static void main(String[] args) { 

     List db = new ArrayList(); 

     ShopDatabase sb = new ShopDatabase(db); 
     sb.addEntry(new ProductEntry("film", 30, 400)); 
     sb.addEntry(new CashierEntry("Kate", "Smith", 23, 600)); 
     sb.addEntry(new ManagerEntry("Jack", "Simpson", 1, 700)); 
     sb.addEntry(new ProductEntry("soap", 18, 3)); 
     sb.addEntry(new ManagerEntry("Helen", "Jones", 60, 650)); 
     sb.addEntry(new CashierEntry("Jane", "Tomson", 15, 900)); 
     sb.addEntry(new ProductEntry("shampoo", 25, 5)); 
     sb.addEntry(new CashierEntry("Bill", "Black", 59, 300)); 
     Collections.sort(db); 
     Iterator itr = db.iterator(); 

     while (itr.hasNext()) { 
      Entry element = (Entry) itr.next(); 
      System.out.println(element + "\n"); 
     } 
    } 
} 

public abstract class Entry implements Comparable { 

    public String name; 
    public int id; 

    public Entry(String name, int id) { 
     this.name = name; 
     this.id = id; 
    } 

    public String getName() { 
     return this.name; 
    } 

    public int getId() { 
     return this.id; 
    } 

    public int compareTo(Object entry) { 
     Entry temp = (Entry) entry; 
     int difference = this.id - temp.id; 
     return difference; 
    } 

    public String toString() { 
     return this.id + " " + this.name; 
    } 
} 



public class People extends Entry { 

    private String name; 
    private String familyName; 
    private int id; 
    private int salary; 

    public People(String name, String familyName, int id, int salary) { 
     super(name, id); 
     this.familyName = familyName; 
     this.salary = salary; 
    } 

    /* 
    * public String toString() { return this.id + " " + this.name + " " + 
    * this.familyName + " " + this.salary; } /*public int compareTo(Object 
    * entry) { Entry temp = (Entry) entry; int difference = this.id - temp.id; 
    * return difference; 
    * 
    * } 
    */ 

} 


public class ProductEntry extends Entry { 

    public String name; 
    public int id; 
    public int stock; 

    public ProductEntry(String name, int id, int stock) { 
     super(name, id); 
     this.stock = stock; 
    } 

    /* 
    * public String toString() { return this.id + " " + this.name + " " + 
    * this.stock; } /*public int compareTo(Object entry) { Entry temp = (Entry) 
    * entry; int difference = this.id - temp.id; return difference; 
    * 
    * } 
    */ 
} 



public class ManagerEntry extends People { 

    public String name; 
    public String familyName; 
    public int id; 
    public int salary; 

    public ManagerEntry(String name, String familyName, int id, int salary) { 
     super(name, familyName, id, salary); 
    } 
} 



public class CashierEntry extends People { 

    public String name; 
    public String familyName; 
    public int id; 
    public int salary; 

    public CashierEntry(String name, String familyName, int id, int salary) { 
     super(name, familyName, id, salary); 
    } 

    /* 
    * public String toString() { return this.id + " " + this.name + " " + 
    * this.familyName + " " + this.salary; } 
    */ 
} 

任何人都可以請幫助時,我有這樣的代碼輸出是爲什麼當我取消註釋toString它寫入null?

1 Jack 

15 Jane 

18 soap 

23 Kate 

25 shampoo 

30 film 

59 Bill 

60 Helen 

,但如果我在人民和ProductEntry取消註釋的toString輸出

0 null Simpson 700 

0 null Tomson 900 

0 null 3 

0 null Smith 600 

0 null 5 

0 null 400 

0 null Black 300 

0 null Jones 650 

爲什麼名字和ID是becomming空值 ????預先感謝您

+1

調試器 - 你使用它嗎? – bezmax

回答

2

原因是名稱和ID爲空。

當您檢索this.id時,它將返回此類(ProductEntry)成員變量的值而不是其超類(這是您在此情況下所需的值)。如果這些成員變量未在ProductEntry中定義,則調用this.id將從超類中檢索id,在這種情況下爲Entry。這就是所謂的Variable shadowing

你可以用兩種可能的方式解決問題。首先是簡單地從Entry的子類中移除名稱和ID成員變量。這將意味着this.id將訪問Entry的成員變量,而不是其子類ProductEntry。另一個選擇是簡單地在構造函數中賦值,但是因爲您已經將這些值存儲在超類中,所以我認爲這不是最好的方法。

本着封裝的精神,您也可以考慮將您的成員變量設置爲私有的(只能由其中定義的類訪問)或受保護的(可由其定義的類及其子類訪問)。

0

因爲在People你從來沒有設置成員變量。你只能通過nameid超級類。而在toString()中,您使用的是變量People而不是來自超類。你是shadowing them

1

問題是你有多個字段叫做namePeople陰影中的一個在Entry之一,依此類推。

會發生什麼情況是,構造函數把基類的name,並toString()打印出的派生類的name(這從未初始化,因此null)。

id相同。

只需從PeopleProductEntry刪除nameid,它的行爲將與您的預期相同。

5

你是shadowing (JLS 6.3.1)nameid:你設置超類的屬性,但你打印Person s,它從來沒有設置。 OOP的要點是專門而不是來重新實現共享行爲。

0

您的類中有多個名稱,ID,...變量。構造函數將tostring在子類中使用的那些元素設置爲null。從子類中刪除公共變量聲明。

0

People你沒有設置變量的名字和id,你把它們發送給超類。因此他們不存在於你的人民班,而當你試圖印刷他們時,你最終會「遮蔽」他們。

0

People中的this.name訪問該類別的本地域name。您永遠不會爲該字段賦值(而是爲Entry中的相同字段賦值),因此它總是會返回null

0

ProductEntry和People在子類中都有名爲「name」的成員。刪除這個子類的成員,它應該像你期望的那樣工作。

基本上發生了什麼是子類成員隱藏超類成員,但在初始化期間,您正在委託給超類,因此它初始化現在隱藏的Entity.name成員,它從Person和ProductEntry中不可見了。

0

你遮蔽變量nameid名爲name等領域,並id,所以編譯器感到困惑,以什麼來指代(超類版本,或從Person版本,這是從來沒有定義)。按照@ aix's和@Dave Newton的建議,你會很開心。

相關問題