2014-09-20 81 views
-1

我有擴展另一個類,我試圖把它弄IDNUM從中但我每次編譯的時候我得到的錯誤編譯器不能找到符號

Student.java:11: error: cannot find symbol 
     this.idnum = idnum; 
     ^
    symbol: variable idnum 

這是我的類代碼編譯測試類,我可以得到名稱被調用,但不idnum是否有我的代碼有問題?

public class Student extends Person { 
    private int credits; 
    private double gradePoints; 

    public Student(String name, String idnum, int credits, double gradePoints){ 
     this.name = name; 
     this.idnum = idnum; 
     this.credits = credits; 
     this.gradePoints = gradePoints; 
     } 

    public void setName(String name) { 
     this.name = name; 
     } 
    public void setId(String idnum){ 
     this.idnum = idnum; 
     } 
    public void setCredits(int credits){ 
     this.credits = credits; 
     } 
    public void setGradePoints(double gradePoints){ 
     this.gradePoints = gradePoints; 
     } 

    public String getName(){ 
     return name; 
     } 
    public String getId(){ 
     return idnum; 
     } 
    public int getCredits(){ 
     return credits; 
     } 
    public double getGradePoints(){ 
     return gradePoints; 
     } 
} 

Person類

public class Person {  
    private String name; 
    private String idnum; 

    public Person(String name,String idnum){ 
     this.name = name; 
     this.idnum = idnum; 
     } 

    public void setId(String idnum){ 
     this.idnum = idnum;  
     } 

    public String getId() { 
     return idnum; 
     } 
    public void setName(String name) { 
     this.name = name; 
     } 

    public String getName() { 
     return name; 
     } 

    @Override public String toString() 
     { 
     return name + " " + idnum; 
     } 
} 
+0

閱讀:http://stackoverflow.com/questions/25706216/what-does-a-cannot-find-symbol-compilation-error-mean – 2014-09-21 02:19:02

回答

1

只需調用超類的構造函數來初始化超類專用字段。私人成員對外界無法訪問,即使是它的子類。

public Student(String name, String idnum, int credits, double gradePoints) { 
     super(name, idnum); 
     this.credits = credits; 
     this.gradePoints = gradePoints; 
} 
+0

嘗試這種方式,並得到錯誤Student.java:10:錯誤:沒有找到合適的構造函數Person(String,String) super(name,idnum); ^ 構造Person.Person(字符串,整數)不適用 (實際參數字符串不能轉換的方法調用轉換爲int) 構造Person.Person()是不適用 – Robert 2014-09-20 02:28:03

+1

@Robert如果這是你的錯誤越來越多,那麼你不會向我們展示你正在編譯的代碼。給定的代碼將'idnum'作爲'String',但你的錯誤表明它只是一個'int'。 – 2014-09-20 02:29:26

+0

@DrewMcGowen非常感謝您,我意識到自己的錯誤,並且正在將我的Person類更改爲我需要的內容,但未保存並覆蓋我的項目中仍然存在錯誤的文件,因此它讀錯了一個 – Robert 2014-09-20 02:55:58

0

您不能訪問Person類私有字段。要麼使用它的getter,要麼將該字段更改爲protected或public。

0

idnum(和name)是一個Personprivate字段,這意味着沒有其他類(包括亞類)可以訪問字段。使用protected修飾符,以便子類(如Student)可以訪問該字段。

+0

在Person類改爲私有以保護,但仍然有相同的錯誤。 – Robert 2014-09-20 02:25:56

+0

試着讓'name'也是'protected'? – August 2014-09-20 02:31:22

0

因爲idnum在類Person中聲明爲私有,所以不能在類之外訪問 - 包括派生類。爲了解決這個問題,使用Person構造從Student內:

public Student(String name, String idnum, int credits, double gradePoints) 
{ 
    super(name, idnum); 
    this.credits = credits; 
    this.gradePoints = gradePoints; 
} 

另外,請注意,nameidnum的getter和setter方法不需要Student重新定義,因爲他們是完全一樣的在Person

0

很高興知道解決方案,但您應該瞭解這些概念。

在java中我們有四個訪問說明

1. public 
2. private 
3. protected 
4. default(no specifier) 

public specifiers :

公衆說明符實現無障礙的最高水平。聲明爲public的類,方法和字段可以從Java程序中的任何類訪問,無論這些類是在同一個包還是在另一個包中。

實施例:

public class Demo { // public class 
    public x, y, size; // public instance variables 
} 

private specifiers :

私人說明符實現的accessibility.private方法和字段的最低水平可僅向所述的方法和字段屬於同一類中進行訪問。 私有方法和字段在子類中不可見並且不被子類繼承。因此,私人訪問說明符與公共訪問說明符相反。使用Private Specifier,我們可以實現封裝並隱藏來自外部世界的數據。

實施例:

public class Demo { // public class 
    private double x, y; // private (encapsulated) instance variables 

    public set(int x, int y) { // setting values of private fields 
     this.x = x; 
     this.y = y; 
    } 

    public get() { // setting values of private fields 
     return Point(x, y); 
    } 
} 

protected specifiers :

方法和字段聲明爲保護的只能由其它包或包中受保護成員的類內的任何類子類進行訪問。受保護的訪問說明符不能應用於類和接口。

例子:

public class Person {  
    protected String name; 
    protected String idnum; 
} 

default(no specifier):

當你不設置訪問符的元素,它會按照默認的訪問級別。沒有默認的說明符關鍵字。可以默認訪問類,變量和方法。使用默認指定符,我們可以訪問屬於同一個包的類,方法或字段,但不能從此包之外訪問。

例子:

class Demo 
{ 
    int i; (Default) 
}