构造函数 + 继承支持
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
字段也是如此。
我对继承还很陌生,我不确定我做的是否正确,但我似乎走在正确的轨道上。该程序运行良好,但我得到的输出不正确。我认为问题出在我的构造函数上。
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
字段也是如此。