【问题标题】:Class Declarations, Constructors and toString methods for all the classes所有类的类声明、构造函数和 toString 方法
【发布时间】:2014-06-09 18:05:24
【问题描述】:

问题:
实现一个超类 Person。制作两个班级,学生和教师 从 Person 继承。一个人有名字和出生年份。一个学生 有专业,导师有工资。编写类声明, 构造函数,以及所有类的 String 方法。编写测试程序 测试这些类和方法。

这可能并不复杂,但我是 java 初学者。请帮我。 我在构造函数 'student()' 和 'instructor()' 中都遇到了以下错误。

"constructor Person in class Person cannot be applied to given types;
  required: String,int
  found: no arguments
  reason: actual and formal argument lists differ in length."

这是我的代码:

package One;

class Person{
    String name;
    int yob;

    Person(String s, int d){
        name = s;
        yob = d;
    }
    @Override
    public String toString(){
        return "Name: "+name+"\n Year of Birth: "+yob;
    }
}
class Student extends Person{
    String major;

    Student(String s){
        major = s;
    }
    @Override
    public String toString(){
        return "The student did his majors in "+major;
    }
}
class Instructor extends Person{
    int salary; 

    Instructor(int a){
        salary = a;
    }
    @Override
    public String toString(){
        return String.format("The salary is ",salary);
    }
}

public class Test {

    public static void main(String[] args) {
        Person p = new Person("Stephen", 1991);
        System.out.println(p);
    }
}

提前致谢。

【问题讨论】:

  • 你必须在 Person 类 Person(){} 中实现一个不带参数的构造函数

标签: java class testing constructor tostring


【解决方案1】:

在您的代码中,StudentInstructor 类派生自 Person。这意味着派生类也需要基类所需的任何构造函数参数。当你创建一个Student 时,编译器如何知道在Person 构造函数的参数中放入什么?

所以代码应该是这样的:

// Student constructor
Student(String majorParam, String nameParam, int yobParam)
{
    super(nameParam, yobParam);
    this.major = majorParam;
}

...

// Similarly, Instructor constructor
Instructor(int salaryParam, String nameParam, int yobParam)
{
    super(nameParam, yobParam);
    salary = salaryParam;
}

注意我们如何使用super 构造函数关键字传递基类Person 所需的构造函数参数。这始终必须是派生类构造函数中的第一行。

那么你可以构造StudentInstructor为:

Student s = new Student("TheMajor", "TheName", 42);

Instructor i = new Instructor(1000, "TheName", 42);

【讨论】:

  • @SotiriosDelimanolis:我也在阅读这篇文章来学习。较早的答案是哪种语言? C++?
【解决方案2】:

Person 类中没有空的构造函数,所以你必须创建它,它应该可以完美运行。不要忘记,除非显式调用,否则默认调用 super()。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-10-15
    • 2019-11-28
    • 2013-05-02
    • 1970-01-01
    • 2019-03-04
    • 2013-05-28
    • 2016-02-09
    • 2016-05-16
    相关资源
    最近更新 更多