当前位置: 首页 > 知识库问答 >
问题:

实现继承重写toString方法

陈浩
2023-03-14

我创建了一个(个人、学生、员工、教职员工)类。Person必须将Student和Employee分为子类。Employee有两个子类:教员和职员。我已经完成了所有的编码,他们工作得很好,除了我的驱动程序类TestPerson程序给出了编译错误

注:一个测试程序,创建一个人、学生、员工、教职员工,并调用他们的toString方法。

驱动程序类TestPerson的错误。以下是java:-

 
error: constructor Student in class Student cannot be applied to given types;
error: no suitable constructor found for Employee(String,String,String,String)
error: constructor Faculty in class Faculty cannot be applied to given types;
error: no suitable constructor found for Staff(String,String,String,String)"

**我只是提供驾驶员等级的代码。如果你需要我对其他课程的其他编码,请在评论中说明,我会立即发布。

请看下面我的代码:-

public class TestPerson {

    public static void main(String[] args) {
        Person person = new Person("John Doe", "123 Somewhere", "415-555-1212", "johndoe@somewhere.com");
        Person student = new Student("Mary Jane", "555 School Street", "650-555-1212", "mj@abc.com", "junior");
        Person employee = new Employee("Tom Jones", "777 B Street", "40-88-889-999", "tj@xyz.com");
        Person faculty = new Faculty("Jill Johnson", "999 Park Ave", "92-52-22-3-333", "jj@abcxyz.com");
        Person staff = new Staff("Jack Box", "21 Jump Street", "707-21-2112", "jib@jack.com");

        System.out.println(person.toString() + "\n");
        System.out.println(student.toString() + "\n");
        System.out.println(employee.toString() + "\n");
        System.out.println(faculty.toString() + "\n");
        System.out.println(staff.toString() + "\n");
        }
}

//个人类

public class Person {

    private String name;
    private String address;
    private String phone_number;
    private String email_address;

    public Person() {
    }

    public Person(String newName, String newAddress, String newPhone_number, String newEmail){
        name = newName;
        address = newAddress;
        phone_number = newPhone_number;
        email_address = newEmail;
    }

    public void setName(String newName){
        name = newName;
    }

    public String getName(){
        return name;
    }

    public void setAddress(String newAddress){
        address = newAddress;
    }

    public String getAddress(){
        return address;
    }

    public void setPhone(String newPhone_number){
        phone_number = newPhone_number;
    }

    public String getPhone(){
        return phone_number;
    }

    public void setEmail(String newEmail){
        email_address = newEmail;
    }

    public String getEmail(){
        return email_address;
    }

    public String toString(){
        return "Name :"+getName();
    }

}

//学生类

public class Student extends Person {

    public final String class_status;

    public Student(String name, String address, int phone, String email, String classStatus) {
    super(name, address, phone, email);
    class_status = classStatus;
    }
    public String toString(){
        return "Student Status: " + super.getName();
    }

}

//雇员阶级

import java.util.Date;
public class Employee extends Person{

    private String office;
    private double salary;
    private Date hire;

    public Employee() {
    }

    public Employee(String name, String address, int phone, String email){
        super(name, address, phone, email);
    }

    public Employee(String office, double salary, Date hire){
        this.office = office;
        this.salary = salary;
        this.hire = hire;
    }

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

    public String getOffice(){
        return this.office;
    }

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

    public double getSalary(){
        return this.salary;
    }

    public void setHire(Date hire){
        this.hire = hire;
    }

    public Date getHire(){
        return this.hire;
    }

    public String toString(){
        return "Office " + super.getName();
    }
}

//教师班

public class Faculty extends Employee {
    private String officeHours;
    private int rank;

    public Faculty(String name, String address, int phone, String email) {
    super(name, address, phone, email);
    }

    public String toString(){
        return "Office " + super.getOffice();
    }
}

//职员班

public class Staff extends Employee {
    private String title;

    public Staff(String name, String address, int phone, String email) {
    super(name, address, phone, email);
    }

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

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

    public String toString(){
        return "Title :" + super.getName();
    }
}

共有3个答案

昝欣可
2023-03-14

Person的构造函数需要一个字符串作为第三个参数,但您正试图将int phone传递给子类中的超级构造函数。那不行,因为型号不对。

顺便说一下:你应该总是用字符串来表示电话号码,而不是整数。

  1. 加或减电话号码没有意义。
  2. 整数不允许前导零,在一些国家,前导零用于区号。
  3. 整数不能大于2147483648,当你试图存储很长的电话号码时,这个看似任意的限制会引起非常意外的bug。
尤夕
2023-03-14

这可能与问题本身无关,但我认为设计可以这样改进:

  • 用角色的名字定义抽象类Role
  • 定义类学生,员工,员工无论什么继承角色
  • 定义类Person,该类具有所有人类型,名称等的公共属性,并且具有角色类型的属性

然后定义toString on Person和all Role实现

通过这种方式,您将能够独立于角色扩展或修改人员,从而使设计更加灵活

空夕
2023-03-14

出现这些错误的原因是构造函数不存在。

错误:类Student中的构造函数Student不能应用于给定类型;错误:找不到适合员工的构造函数(String,String,String,String)

这意味着您将无法编译代码,除非:

Student(String name, String addr, String phone, String email) {
    ....
}

假设您已经在构造函数中设置了属性,toString将如下所示:

public String toString() {
    return this.name + "\n" + this.addr + "\n" + this.phone + "\n" + this.email;

}

使现代化

你的问题是学生只有这个构造函数:

public Student(String name, String address, int phone, String email, String classStatus)

Student需要一个只接受四个字符串作为参数的构造函数。或者,您可以使所有内容都采用指定的五个参数。

 类似资料:
  • “编写一个名为clsWorker的超类和子类clsHourlyWorker和clssalariedworker。每个工人都有一个名字和一个工资率。编写计算每个员工周薪的方法computePay(int hours)。小时工按实际工作小时数获得小时工资,如果小时数最多为40小时。如果小时工工作超过40小时,则按时间半支付超出部分。受薪工人得到40小时的小时工资,无论实际小时数是多少。为继承编写一个测

  • 问题内容: 我有两个课,和。它们看起来像这样: 此错误指向Field的: 我希望首先调用Background init ()。要将“ a,b”传递给Fields的 init (),Field会分配a和b,然后将其中包含三个0的列表分配给field。然后让Background的 init ()继续,然后调用它自己的buildField()并用包含c的列表覆盖self.field。 似乎我还没有完全理

  • 如何/可以重写来自非继承类的方法?其次,有没有比“非继承类”更好的术语? 我有一个“扩展”JFrame的类,需要从JPanel重写paintComponent。怎么做?或者它可以扩展JPanel,并需要访问方法,如setTitle()、setResizable()和setDefaultCloseOperation();

  • 我正在编写一个带有对象的游戏,我想根据它的类使用不同的命令。我有一个超级类“项目”,一个子类“工具扩展项目”和“锤子扩展工具”。在项目超类(抽象)中,我有一个抽象方法“doCommand”,我在工具中覆盖了它。这很好用,我现在在工具中有一个有效的“doCommand”。但是当我想在 Hammer 中覆盖这个“doCommand”时,它只是使用工具的“doCommand”。 这来自调用方法的类的一部

  • 我一直在读关于在处理子类时如何最好地重写equals方法的文章,在这里我发现了不少帖子。他们建议使用instanceof或getClass()实现解决方案的不同方法来比较不同子类的对象。 然而,关于有效的Java,我的理解是(我对这一点还不熟悉,所以我很可能是错的!)布洛赫认为,最终两者都会有问题,“除非你愿意放弃面向对象抽象的好处,否则没有办法在保留equals契约的同时扩展一个可实例化类并添加