This is a relatively simple program but for some reason, I can't compile it. I'm pretty sure the code is correct and working.

My compiler keeps saying that it cannot find a constructor matching a HourlyWorker constructor when I instantiate a HourlyWorker object. I've checked and rechecked the code (in WorkerTester and HourlyWorker classes) to make sure everything matches, but I can't find anything wrong.

Worker.java

public class Worker
{
	public Worker(String n, int r)
	{
		name = n;
		rate = r;
	}
	public double computePay(int hours)
	{
		return (rate * hours);
	}
	public int getRate()
	{
		return rate;
	}
	private String name;
	private int rate;
}

SalariedWorker

public class SalariedWorker extends Worker
{
	public SalariedWorker(String n, int r)
	{
		super(n, r);
	}
	public double computePay(int hours)
	{
		double totalPay = 0;

		totalPay = this.getRate() * 40;

		return totalPay;
	}
}

HourlyWorker.java

public class HourlyWorker extends Worker
{
	public HourlyWorker(String n, int r)
	{
		super(n, r);
	}
	public double computePay(int hours)
	{
		double totalPay = 0;

		if (hours >= 0 && hours <= 40)
			totalPay = this.getRate() * hours;
		else
			totalPay = this.getRate() * ((hours - 40) * 1.5 + 40);

		return totalPay;
	}
}

/**
This class tests class Worker and its subclasses.
*/
WorkerTester.java

public class WorkerTester
{
   public static void main(String[] args)
   {
      Worker s = new SalariedWorker("Sally", 40);
      Worker h = new HourlyWorker("Harry", 40);

      System.out.println(s.computePay(30));
      System.out.println("Expected: 1600");
      System.out.println(h.computePay(30));
      System.out.println("Expected: 1200");
      System.out.println(s.computePay(50));
      System.out.println("Expected: 1600");
      System.out.println(h.computePay(50));
      System.out.println("Expected: 2200");
   }
}

Dani AI

Generated

Most likely cause: your local compiler is picking up a different HourlyWorker class (or an out-of-date HourlyWorker.class) than the source you pasted. That explains why the exact same sources compile on the school machine but fail locally. The Java compiler will link against whatever HourlyWorker it finds on the classpath; if that class file lacks a (String,int) constructor you’ll get the “no matching constructor” error even though your .java looks correct.

Quick, practical checks to run in your project folder:

# look for stray compiled classes
# Windows:
dir /s HourlyWorker.class

# Unix/mac:
find . -name 'HourlyWorker.class'

# inspect the class the JVM/javac actually sees (shows constructors)
javap -classpath . HourlyWorker

# remove all compiled classes and recompile every source in the directory
del *.class        (Windows)   or   rm *.class    (Unix)
javac *.java

# show CLASSPATH value
echo %CLASSPATH%   (Windows)   or   echo $CLASSPATH   (Unix)

Checklist of likely problems and fixes:

  • Duplicate HourlyWorker.class somewhere earlier on CLASSPATH (delete or move it, or compile with a clean CLASSPATH).
  • A package declaration in one file but not in others; source must reside in matching folder structure and be compiled with the correct -d/-classpath settings.
  • Filename/public-class mismatch (public class HourlyWorker must live in HourlyWorker.java).
  • Stale .class files: delete them and run a full rebuild (javac *.java).
    If you want more help, post the output of javap -classpath . HourlyWorker, javac -verbose WorkerTester.java, and the value of your CLASSPATH. Note that and were correct to point at classpath/organization; ’s default-constructor suggestion is not relevant here.

Recommended Answers

All 8 Replies

compile with

javac -classpath . <Classname>.java

Still getting the same problem.

I've copied your code and it works perfectly. How do you have your files organized?

Like this?
-WorkerDirectory
+ Worker.java
+ HourlyWorker.java
+ SalariedWorker.java
+ WorkerTester.java

Some package definitions lacking maybe?

Black Box

Show your exact directory structure, and the exact command you used to compile.

Show your exact directory structure, and the exact command you used to compile.

c:\fall2007\test\Homework\Due Dec 5> javac WorkerTester.java

The WorkerTester.java file as well as all the other files associated with it is located in the directory, so I don't think I have to specify the classpath as a parameter.

I get the same compile-time error as when I compile the file with Textpad; can't find an HourlyWorker constructor matching the declaration.

I've copied your code and it works perfectly. How do you have your files organized?

Like this?
-WorkerDirectory
+ Worker.java
+ HourlyWorker.java
+ SalariedWorker.java
+ WorkerTester.java

Some package definitions lacking maybe?

Black Box

Everything is in the same directory.

edit: hmm..weird. I tried to compile the files on the compiler at school and it works fine.

hi from my understanding there is no default constructor defined in any of the Classes that you wrote.when you are overloading constructor the default constructor is not provided. externally you have to write the default constructor

tell me i am wrong.

hi from my understanding there is no default constructor defined in any of the Classes that you wrote.when you are overloading constructor the default constructor is not provided. externally you have to write the default constructor

tell me i am wrong.

This has nothing to do with a default constructor. And, you never have to implement a default constructor. Only if you want to.

Edit: Well, I shouldn't really say never, but at least the cases where you might have to are not that common, and definately not a problem in this case.

The WorkerTester.java file as well as all the other files associated with it is located in the directory, so I don't think I have to specify the classpath as a parameter.

"." is not necessarily on the classpath, and if it is not, then yes, you do have to add it. So did you actually try with the command I showed you? Or did you just assume that it wouldn't make a difference? Also, try to compile one of the classes that does not depend on any of the others, and then make sure that the classfile actually appears in the same directory as the java file (not that you have some alias set that automatically causes the compiler to place the class files elsewhere). If it is there, then compile them one at a time from the file with the least dependencies, to the file with the most. More than bit annoying, but hey.

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.