2010-11-30 228 views
0

我正在爲班級任務編寫員工,經理,小時工的代碼,但是我遇到了一個我無法弄清楚的問題,以下是我的員工代碼,然後是小時工。問題是小時工不會編譯,它會給我一個「找不到符號構造函數員工」的錯誤,當我嘗試編譯時(員工類compiiles沒有問題,任何建議請嗎?我想我一直在盯着它很久我再也看不到問題的感謝彼得Java編譯器錯誤:「找不到符號構造函數..」?

Employee類 - !。

public class Employee 
{ 
    public String firstName; 
    public String lastName; 
    public double hourlyRate; 
    final static double NORMAL_WORKWEEK = 37.5; 

    public Employee(String firstName, String lastName, double hourlyRate) 
    { 
     setFirstName(firstName); 
     setLastName(lastName); 
     setHourlyRate(hourlyRate); 
    } 
    //Accessor and Mutator Methods for the employee's first name. 
    public String getFirstName() 
    { 
     return firstName; 
    } 

    public void setFirstName(String firstName) 
    { 
     firstName = firstName; 
    } 
    //Accessor and Mutator Methods for the employee's last name. 
    public String getLastName() 
    { 
     return lastName; 
    } 

    public void setLastName(String lastName) 
    { 
     lastName = lastName; 
    } 
    //Access and Mutator Methods for the employee's hourly rate. 
    public double getHourlyRate() 
    { 
     return hourlyRate; 
    } 
    public void setHourlyRate(double hourlyRate) 
    { 
    //If the user input is valid, update the employee's hour rate with the newly input value. 

    if(hourlyRate > 0) 
    { 
     hourlyRate = hourlyRate; 
     } 
     //Otherwise prevent an hour rate greater than zero being overwritten 
     else if(hourlyRate <=0) 
     { 

    if(hourlyRate <= 0) 
    {   
      hourlyRate = 0; 
      } 

    decorateConsole(); 

    //Alert the user to their mistake. 
    System.out.println("Error ! ! ! - An attempt to set the employee " + this.firstName + " " + this.lastName + "'s hourly rate to zero was detected.\n"); 

    decorateConsole(); 

    } 


} 

public void printState() 
{ 

    decorateConsole(); 

    System.out.println("[FIRST NAME] = " + firstName + " [LAST NAME] = " + lastName + " [HOURLY RATE] = " + hourlyRate + "\n"); 

    decorateConsole(); 

} 

public void decorateConsole() 
{ 

    System.out.println("+-< EMPLOYEE INFO >-------------------------------------------------------------------------------------------------------------------------+\n"); 

} 

小時工CLASS -

public class HourlyWorker extends Employee 
{ 
    private double wage; 
    private double hours; 

    public HourlyWorker(String firstName, String lastName, double hourlyWage, double hoursWorked) 
    { 
     super(firstName, lastName); 
     this.wage = wage; 
     this.hours = hours; 
    } 

    public void setWage (double hourlyWage) 
    { 
     this.wage = wage; 
    } 
    public void getWage() 
    { 
     return wage; 
    } 
    public void setHours (double hours) 
    { 
     this.hours = hours; 
    } 
    public double getHours() 
    { 
     return hours; 
    } 




} 
+0

你的編譯命令是什麼? – dacwe 2010-11-30 21:47:18

+2

我建議你下次粘貼錯誤代碼,這樣更容易發現錯誤。 – OscarRyz 2010-11-30 21:47:51

+0

你的二傳手破碎了。 `firstName = firstName` - 將`firstName`(局部變量)的值賦給局部變量`firstName`(即它覆蓋自身)。你應該寫`this.firstName = firstName`。 – Crozin 2010-11-30 22:25:22

回答

9

呦ü沒有Employee構造帶兩個參數:使用

super(firstName, lastName); 

嘗試:

super(firstName, lastName, 0.0); 

編輯按照託尼的要求,這裏有一個更詳細的解釋。

With super(firstName, lastName);您正在調用(嘗試調用)類Employee中的構造函數,該構造函數有兩個字符串參數。

回顧Employee類的定義,我們看到你沒有這樣的構造,但你有一個有三個參數:

public Employee(String firstName, String lastName, double hourlyRate) 

所以,解決的辦法是調用該構造函數來代替。由於您沒有hourlyRate的默認值,我們可以使用0.0,它是雙精度值。

其他替代方案將在Employee

public Employee(String firstName, String lastName) 
+0

感謝奧斯卡,通過添加0.0(和更改公共無效getWage公共雙getWage)它compliles,但我不明白爲什麼,你能解釋如何0。0解決了它,或者至少看起來已經解決了嗎? – tony 2010-11-30 21:56:31

+0

@tony:Surre,我已經更新了答案,讓我知道是否足夠清楚 – OscarRyz 2010-11-30 22:00:14

+0

感謝奧斯卡,這是非常有益的 - 我特別感謝快速反應!託尼 – tony 2010-11-30 22:03:55

2

創建兩個參數的構造在HourlyWorker你叫

super(firstName, lastName); 

Employee構造是

Employee(String, String, double) 

的簽名不匹配。

編輯:順便說一句,爲什麼HourlyWorker有一個私人的wage成員? Employee.hourlyRate與概念上有什麼不同?

1

您沒有隻有兩個參數的超級構造函數。

1

HourlyWorker的構造函數試圖調用super(firstName, lastName),但是在父類中沒有聲明這樣的構造函數。

0

這裏有一些可怕的事情發生在else if的周圍。如果缺少一些花括號,它會重複。正確縮進您的代碼並確保敞開的捲曲與最後的捲曲相匹配。

if(hourlyRate > 0) 
    { 
     hourlyRate = hourlyRate; 
     } 
     //Otherwise prevent an hour rate greater than zero being overwritten 
     else if(hourlyRate <=0) 
     { 

    if(hourlyRate <= 0) 
    {   
      hourlyRate = 0; 
      } 

    decorateConsole(); 

此外,由於預期這幾樣線是不行的(你有3臺):

firstName = firstName; 

它必須是:

this.firstName = firstName; 

像你有你第二課。

1

在你HourlyWorker類,你有下面的代碼行:

super(firstName, lastName); 

但是,有在你的員工類中沒有匹配的構造函數。基本上,編譯器是在尋找你的員工類像...

public Employee(String firstName, String lastName) 
{ 
    ... 
} 

定義一個新的構造,或者叫你與你錯過的參數定義的構造函數。

1

您正在調用HourlyEmployee的基類構造函數(它是Employee的ctor),它帶有2個參數而不是它想要的3個參數。

變化從HourlyEmployee構造函數行:

super(firstName, lastName); 

super(firstName, lastName, hourlyWage); 
4

在HourlyWorker構造你試着撥打Employee構造是這樣的:

super(firstName, lastName); 

但Employee類沒有帶兩個參數的構造函數。您需要通過這樣的第三個參數(時薪):

super(firstName, lastName, 42); 
2

在你HourlyWorker類,你都呼籲員工的構造{超(名字,姓氏)}有兩個參數,但在Employee類你不有任何具有兩個參數的構造函數。

1

另外,如果你仍然想有一個像

public Employee(String firstName, String lastName) { ... }

一個構造函數,你知道,從你的double hourlyRate的默認值,你可以嘗試寫一個新的構造像下一個:

`公共僱員(字符串名字,字符串的lastName) {

 Employee(firstName, lastName, 0.0); 

} `