1

I am using Eclipse to run this code program to test a Person class and its subclasses. In Eclipse it shows there are errors--that each child class must be defined in its own file.

I am learning Java, and would like to know if this is a must? Or can I make it work with parent and child classes all in one file? If I'm missing something, please point me in the right direction. Thank you!

Here is my code: [I put this is all in one file on Eclipse]

import java.util.*;
//Test program to test Person class and its subclasses
public class Test {
public static void main(String[] args) {

    Person person = new Person("person");
    Student student = new Student ("student");
    Employee employee = new Employee("employee");
    Faculty faculty = new Faculty("faculty");
    Staff staff = new Staff("staff");

    //invoke toString() methods
    System.out.println(person.toString());
    System.out.println(student.toString());
    System.out.println(employee.toString());
    System.out.println(faculty.toString());
    System.out.println(staff.toString());
}
}

//Defining class Person
public class Person {
protected String name;
protected String address;
protected String phoneNum;
protected String email;

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

public String getName() {
    return name;
}

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

public String getAddress () {
    return address;
}

public void setAddress(String address) {
    this.address = address;
}

public String getPhoneNum() {
    return phoneNum;
}

public void setPhoneNum(String phoneNum) {
    this.phoneNum = phoneNum;
}

public String getEmail() {
    return email;
}

public void setEmail (String email) {
    this.email = email;
}

@Override
public String toString() {
    return "Name:"+getName()+"Class:"+this.getClass().getName();
}
}

//Defines class Student extends Person
public class Student extends Person {
public static final String FRESHMAN = "freshman";
public static final String SOPHMORE = "sophmore";
public static final String JUNIOR = "junior";
public static final String SENIOR = "senior";

protected String classStatus;

public Student(String name) {
    super(name);
}

public Student(String name, String classStatus) {
    super(name);
    this.classStatus = classStatus;
}

@Override
public String toString() {
    return "Name:"+getName()+"Class:"+this.getClass().getName();
}
}

//Defines class Employee extends Person
public class Employee extends Person {
protected double salary;
protected String office;
protected MyDate dateHired;

public Employee(String name) {
    this(name, 0, "none", new MyDate());
}

public Employee(String name, double salary, String office, MyDate dateHired) {
    super(name);
    this.salary = salary;
    this.office = office;
    this.dateHired - dateHired;
}

public double getSalary() {
    return salary;
}

public void setSalary(double salary) {
    this.salary = salary;
}

public String getOffice() {
    return office;
}

public void setOffice (String office) {
    this.office = office;
}

public MyDate getDateHired() {
    return dateHired;
}

public void setDateHired(MyDate dateHired) {
    this.dateHired = dateHired;
}

@Override 
public String toString() {
    return "Name:"+getName()+"Class:" + this.getClass().getName();
}
}

//Defines class Faculty extends Employee
public class Faculty extends Employee {
public static String LECTURER = "lecturer";
public static String ASSISTANT_PROFESSOR = "assistant professor";
public static String ASSOCIATE_PROFESSOR + "associate professor";
public static PROFESSOR = "professor";

protected String officeHours;
protected String rank;

public Faculty(String name) {
    this(name, "9-5 PM", "Employee");
}

public Faculty(String name, String officeHours, String rank) {
    super(name);
    this.officeHours = officeHours;
    this.rank = rank;
}

public String getOfficeHours() {
    return officeHours;
}

public void setOfficeHours(String officeHours) {
    this.officeHours = officeHours;
}

public String getRank() {
    return rank;
}

public void setRank(String rank) {
    this.rank=rank;
}

@Override
public String toString() {
    return "Name:"+getName()+"Class:"+this.getClass().getName();
}
}

//Defines class Staff extends Employee
public class Staff extends Employee {
protected String title;
public Staff(String name) {
    this(name, "none");
}

public Staff(String name, String title) {
    super(name);
    this.title=title;
}

public String getTitle() {
    return title;
}

public void setTitle(String title) {
    this.title = title;
}

@Override
public String toString() {
    return "Name:"+getName()+"Class:"+this.getClass().getName();
}
}

//Define class MyDate
public class MyDate {
private int month, day, year;

public MyDate (int month, int day, int year) {
    this.day=day;
    this.month=month;
    this.year=year;
}
}
Anna Nguyen
  • 33
  • 1
  • 11

2 Answers2

1

Yes it is a must. One class per file. Class can have inner classes. You can define subclasses as inner classes. But I recommend putting them in separate files and don't use inner classes.

Peter Šály
  • 2,848
  • 2
  • 12
  • 26
1

Yes, there should be one class per file. Moreover, you are using the MyDate class in the Employee class, which you need to extend and you cannot extends more than one class, so it's better use the predefined Date class which is present java.util.Date. Import this in the Employee class.

import java.util.Date;

instead of this:

public Employee(String name, double salary, String office, MyDate dateHired)

use:

public Employee(String name, double salary, String office, Date dateHired)

There are some careless mistakes: in Employee class

public static String ASSOCIATE_PROFESSOR + "associate professor";

change to:

public static String ASSOCIATE_PROFESSOR = "associate professor";

Similarly in faculty class

public static String ASSOCIATE_PROFESSOR + "associate professor";

put = instead of +.

Now this code will work.

Pika Supports Ukraine
  • 3,612
  • 10
  • 26
  • 42
  • 1
    Correction, there should be one **public** class per file. A file is allowed to have multiple non-public classes, although that is usually discouraged as it makes your code harder to discover. – Mark Rotteveel Mar 24 '19 at 08:40