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

所有类的类声明、构造函数和toString方法

乜明朗
2023-03-14

问题:
实现一个超级一流的人。分为两个班,一个是学生班,另一个是教师班。一个人有名字和出生年份。学生有主修课,教师有薪水。为所有类编写类声明、构造函数和字符串方法。编写一个测试程序来测试这些类和方法。

这可能并不复杂,但我是java的初学者。请帮帮我。我在构造器的student()和讲师()上都遇到了以下错误。

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

提前谢谢。

共有2个答案

董高畅
2023-03-14

Person类中没有空构造函数,所以您必须创建它,它应该可以完美地工作。不要忘记,除非显式调用super(),否则默认情况下会调用super()。

姜玉泽
2023-03-14

在代码中,类学生讲师来自个人。这意味着基类所需的任何构造函数参数都是派生类所需的。创建学生时,编译器如何知道在个人构造函数的参数中输入什么?

所以代码应该是这样的:

// 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;
}

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

然后你可以构造学生讲师如下:

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

Instructor i = new Instructor(1000, "TheName", 42);
 类似资料:
  • 解析:这里可能会有误区,其实普通的类方法是可以和类名同名的,和构造方法唯一的区分就是,构造方法没有返回值。<

  • 问题内容: 我有两个类,和,扩展了前一个类。 具有以下构造函数: 我将注意到所有实例变量都已设置为private。 同时,具有以下构造函数: 但是,这为我的构造函数引发了“找不到符号”错误。 我尝试使用,但是我的超类的私有范围阻止了这种情况。 我发现向我的构造函数中添加字段并允许我调用超级构造函数,但是我想知道是否存在一种无需在子类构造函数中传递其所有参数的情况下调用超级构造函数的方法? 问题答案

  • Kotlin中的参数与Java中有些不同。如你所见,我们先写参数的名字再写它的类型: fun add(x: Int, y: Int) : Int { return x + y } 我们可以给参数指定一个默认值使得它们变得可选,这是非常有帮助的。这里有一个例子,在Activity中创建了一个函数用来toast一段信息: fun toast(message: String, length: I

  • 问题内容: 以下是两种方法: 具有所有类属性的构造函数 优点:我必须输入确切数量的参数类型,所以如果出现错误,编译器会警告我(顺便说一句,有什么方法可以防止错误地在参数列表中切换两个Integer的问题?) 缺点:如果我有很多属性,则实例化行可能会变得很长,并且可能跨越两行或更多行 setter和默认的空构造函数 优点:我可以清楚地看到自己的设置,因此,如果我做错了什么,我可以在键入时立即查明它(

  • 主要内容:构造函数的调用顺序,基类构造函数调用规则前面我们说基类的成员函数可以被继承,可以通过派生类的对象访问,但这仅仅指的是普通的成员函数, 类的构造函数不能被继承。构造函数不能被继承是有道理的,因为即使继承了,它的名字和派生类的名字也不一样,不能成为派生类的构造函数,当然更不能成为普通的成员函数。 在设计派生类时,对继承过来的成员变量的初始化工作也要由派生类的构造函数完成,但是大部分基类都有 private 属性的成员变量,它们在派生类中无法

  • 我在为继承另一个类属性的类定义构造函数时遇到困难 我在第 18 行(方面遇到了问题。 我收到的错误发生在我申报< code >运输的地点。 如代码所示,运输类是主体类,继承 这个错误发生在int 最后一个错误发生在两个字符串变量上。