2010-11-30 14 views
0

J'écris le code pour l'employé, le directeur, le travailleur horaire pour une attribution de classe mais j'ai frappé un problème que je ne peux pas comprendre, ce qui suit est mon code pour l'employé suivi par le travailleur horaire. le problème est que l'employé horaire ne compilera pas, il donne une erreur "ne peut pas trouver l'employé du constructeur de symbole" quand j'essaye de compiler (les employés de la classe d'employé sans problème. ne peut plus voir le problème grâce pieterErreur de compilation Java: "impossible de trouver le constructeur de symbole .."?

EMPLOYÉ DE CLASSE -..

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"); 

} 

HORAIRES TRAVAILLEUR CLASSE -

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

Quelle est votre commande de compilation? – dacwe

+2

Je vous suggère de coller le code d'erreur la prochaine fois, il est plus facile de repérer l'erreur de cette façon. – OscarRyz

+0

Vos setters sont cassés. 'firstName = firstName' - qui affecte la valeur de' firstName' (variable locale) à la variable locale 'firstName' (c'est-à-dire qu'elle se substitue elle-même). Vous devriez écrire 'this.firstName = firstName'. – Crozin

Répondre

9

Yo u n'ont pas un constructeur Employee avec deux paramètres:

super(firstName, lastName); 

Essayez d'utiliser:

super(firstName, lastName, 0.0); 

EDIT selon la demande tony, voici une explication plus détaillée. Avec super(firstName, lastName);, vous appelez (en essayant d'invoquer) un constructeur de la classe Employee qui a deux paramètres de chaîne, avec

Revoir la définition de classe Employee, nous vous voir n'avez pas un tel constructeur, mais vous avez un avec trois paramètres:

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

Ainsi, la solution est d'appeler ce constructeur à la place. Puisque vous n'avez pas de valeur par défaut pour hourlyRate, nous pouvons utiliser 0.0 qui est un double.

Autre alternative serait de créer un constructeur à deux paramètres dans la Employee classe

public Employee(String firstName, String lastName) 
+0

merci oscar, en ajoutant le 0.0 (et en changeant le public getWage vide à double getWage public) il se complique mais je ne comprends pas pourquoi, pourriez-vous expliquer comment ce 0.0 résolu, ou au moins semble l'avoir résolu s'il vous plaît? – tony

+0

@tony: Surre, j'ai mis à jour la réponse, laissez-moi savoir si c'est assez clair – OscarRyz

+0

merci oscar, c'est très utile - j'apprécie particulièrement la réponse rapide! Tony – tony

2

En HourlyWorker vous appelez

super(firstName, lastName); 

mais le constructeur Employee est

Employee(String, String, double) 

Les signatures ne correspond pas.

EDIT: Incidemment, pourquoi le HourlyWorker a-t-il un membre privé wage? Comment est-il différent (conceptuellement) de Employee.hourlyRate?

+0

merci cameron, la duplication du salaire privé et le taux horaire est mon erreur, va réparer ça aussi! à votre santé. – tony

1

Vous n'avez pas de super constructeur qui prend seulement deux arguments.

+0

Ok, d'autres étaient plus rapides ... –

1

HourlyWorker Le constructeur tente d'appeler super(firstName, lastName), mais aucun constructeur de ce type n'est déclaré dans la classe parente.

0

Il y a quelque chose de louche autour de else if ici. Il est répété avec un autre si et des accolades manquantes. Indentez correctement votre code et assurez-vous que les curly ouverts correspondent aux fermés.

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(); 

De plus, ce genre de lignes ne fonctionne pas comme prévu (vous avez trois d'entre eux):

firstName = firstName; 

Il doit être:

this.firstName = firstName; 

Comme vous avez dans votre seconde classe.

1

Dans votre classe HourlyWorker, vous avez la ligne de code suivante:

super(firstName, lastName); 

Mais, il n'y a pas de constructeur correspondant dans votre catégorie d'employés. En gros, le compilateur est à la recherche de votre classe d'employé pour quelque chose comme ...

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

Définir un nouveau constructeur, ou appelez le constructeur que vous avez défini les paramètres que vous êtes absent.

+0

Merci pour tous les commentaires rapides, très appréciés! Je pense que ça va maintenant, c'est en train de compiler au moins (selon l'entrée d'oscar et de snakile ci-dessus). – tony

1

Vous appelez le constructeur de classe de base HourlyEmployee (qui est le ctor de Employee) avec 2 arguments au lieu des 3 qu'il veut.

Modifier la ligne EmployeIntermittent cteur de:

super(firstName, lastName); 

à

super(firstName, lastName, hourlyWage); 
4

Dans le constructeur HourlyWorker vous avez essayé d'appeler le constructeur de l'employé comme ceci:

super(firstName, lastName); 

mais le La classe employee n'a pas de constructeur avec deux paramètres. Vous devez passer un troisième paramètre (taux horaire) comme ceci:

super(firstName, lastName, 42); 
+0

je vois merci, oscarryz mentionné quelque chose de similaire ci-dessus et cela explique, merci pour votre aide snakile – tony

2

Dans votre classe HourlyWorker vous appelez le constructeur de l'employé {super (nom, prénom)} avec deux arguments, mais dans la classe des employés que vous n'avez pas avoir des constructeurs qui prennent deux arguments.

+0

merci amrish, je pense que je suis là maintenant ... tony – tony

1

Aussi, si vous êtes toujours désireux d'avoir un constructeur comme

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

et vous connaissez la valeur par défaut de votre double hourlyRate, vous pouvez essayer d'écrire un nouveau constructeur comme la suivante:

`employé publique (String prenom, String lastName) {

 Employee(firstName, lastName, 0.0); 

} `