构造函数 + 继承支持

Constructor + Inheritance support

我对继承还很陌生,我不确定我做的是否正确,但我似乎走在正确的轨道上。该程序运行良好,但我得到的输出不正确。我认为问题出在我的构造函数上。

public class Person {

    protected static String name;
    protected static int birthYear;

    public Person(String name, int birthYear) {
    }

    public String name (String n) {
        n = name;
        return n;
    }

    public int birthYear (int bY) {
        bY = birthYear;
        return bY;
    }

    @Override
    public String toString() {
        return String.format(name + birthYear);
    }
}

public class Student extends Person {

    protected String major;

    public Student(String name, int birthYear, String major) {
        super(name, birthYear);
        major = "";
    }

    public String major(String maj) {
        maj = major;
        return maj;
    }

    public String toString() {
        super.toString();
        return super.toString() + major;
    }

}

public class Instructor extends Person {

    protected static int salary;

    public Instructor(String name, int birthYear, int salary) {
        super(name, birthYear);
        salary = 0;
    }

    public int salary(int sal) {
    sal = salary;
    return sal;
    }

    public String toString() {
        super.toString();
        return super.toString() + salary;
    }

}

public class PersonTester {
    public static void main(String[] args) {

        Person p = new Person("Perry", 1959);
        Student s = new Student("Sylvia", 1979, "Computer Science");
        Instructor e = new Instructor("Edgar", 1969, 65000);

        System.out.println(p);
        System.out.println("Expected: Person[name=Perry,birthYear=1959]");

        System.out.println(s);
        System.out.println("Expected:" +        
        "Student[super=Person[name=Sylvia,birthYear=1979],major=Computer]");

        System.out.println(e);
        System.out.println("Expected:" +    "Instructor[super=Person[name=Edgar,birthYear=1969],salary=65000.0]");
}

}

我得到的输出:

null0
Expected: Person[name=Perry,birthYear=1959]
null0null
Expected: Student[super=Person[name=Sylvia,birthYear=1979],major=Computer     Science]
null00
Expected: Instructor[super=Person[name=Edgar,birthYear=1969],salary=65000.0]

n = name; 这导致了您的问题。必须是name = n;。你所有的 setter 函数都存在这个问题,全部改正并告诉我结果。

尝试将 Person 中的构造函数更改为:

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

目前,构造函数的主体是空的,因此当您在子class构造函数中调用super(name, birthYear);时,实际上什么也没有发生。

您的 Student 构造函数也有错误。您忘记初始化 major 字段。

public Student(String name, int birthYear, String major) {
    super(name, birthYear);
    this.major = major;
}

您在 Instructor 构造函数中遇到了同样的问题...

public Instructor(String name, int birthYear, int salary) {
    super(name, birthYear);
    this.salary = salary;
}

最后,需要去掉Person字段前的static关键字。这是因为 static 确保每个 class 始终有一个(且只有一个)这些字段的实例 ,而不是一个 每个实例,如您所愿:

protected String name;
protected int birthYear;

Instructor 中的 salary 字段也是如此。