继承,Sub-Class,在 Java 中使用 super.print() 打印
Inheritance, Sub-Class, Printing with super.print() in Java
我有 4 个不同的 类。一个标题为 Student
,一个 Instructor
,一个 Person
和 Main
。下面是我的代码:
学生:
public class Student extends Person {
public void print() {
super.print();
System.out.println(", credits: " + credits);
}
}
指导老师:
public class Instructor extends Person{
private double salary;
public double getSalary() {
return salary;
}
public void setSalary(double newSalary) {
salary = newSalary;
}
public void print() {
super.print();
System.out.println(", salary: " + salary);
}
}
人:
public class Person {
private String name;
private String id;
public String getName() {
return name;
}
public void setName(String replacementName) {
name = replacementName;
}
public String getID() {
return id;
}
public void setID(String id) {
this.id = id;
}
public void print() {
System.out.print(name + ", student ID: " + id);
}
}
主线:
public class Main {
public static void main(String[] args) {
Instructor instructor = new Instructor();
instructor.setName("Hani Javadi");
instructor.setID("888777666");
instructor.setSalary(11111);
instructor.print();
System.out.println("--- --- ---");
Student student1 = new Student();
student1.setName("Joe Loop");
student1.setID("810123456");
student1.addCredits(10);
student1.print();
Student student2 = new Student();
student2.setName("Mary Collection");
student2.setID("811987321");
student2.addCredits(25);
student2.print();
Student student3 = new Student();
student3.setName("Ke Method");
student3.setID("810010101");
student3.print();
}
}
当我去输出这段代码时,结果是这样的:
Hani Javadi, student ID: 888777666, salary: 11111.0
Joe Loop, student ID: 810123456, credits: 10
Mary Collection, student ID: 811987321, credits: 25
Ke Method, student ID: 810010101, credits: 0
但是,输出需要第一行为:
Hani Javadi, instructor ID: 888777666, salary: 11111.0
谁能帮忙解决这个小错误?我已经努力了几个小时,试图通过在超类 Person
中添加 if
语句来找到修复它的方法,但似乎没有任何效果。有没有简单的方法让讲师打印语句显示讲师 ID 而不是学生 ID?
也许您应该将 id
字段的打印完全移动到子 class 中,而不是在父 class 中,这样他们就可以确定适当的领先指标。
哟,
发生这种情况是因为你在 Person class 中得到了 'student ID',它适用于抽象级别
例如,您可以尝试在 Person class:
中使用下一个方法
public void print() {
System.out.print(name + ", " + getClass().getName() + " ID: " + id);
}
你的主要问题是,你的 Person
class 说 studentId=...
。这是关于多态性的很好的培训,它已经向您展示了您的方法哪里出了问题。
问题是,Person
不应该有任何 Student
特定的东西。如果它是 Person
的 ID,则应改为 personId=...
。如果 Student
和 Instructor
之间的 ID 完全不同,您需要在这两个 class 中执行这些打印。
多态,继承。这些工具可以做很棒的事情。但如果使用不当,它们会适得其反,这就是你刚刚发生的事情。
现在,说真的,不要那样做:
if (this instanceof Student) {
System.out.print("student ID=" + id)
} else if (this instanceof Instructor) {
System.out.println("instructor ID=" + id);
} else {
// some default here, or I don't know.
}
这绝对有效,但从设计的角度来看,这是一场灾难。 @Skytrace 提到的内容有效,而且几乎没有那么丑陋。但是,它只适用于 class 名称等于您要显示的名称的这种特殊情况。如果有人重构它,将 Student
class 重命名为例如StudentDto
,你会看到StudentDto ID=...
,已经不好看了
在下面的Class人中创建另一个方法
public void print() {
System.out.print(name + ", student ID: " + id);
}
例如
public void print2() {
System.out.print(name + ", Instructor ID: " + id);
}
然后在您的主 class 中调用它作为
instructor.print2();
我有 4 个不同的 类。一个标题为 Student
,一个 Instructor
,一个 Person
和 Main
。下面是我的代码:
学生:
public class Student extends Person {
public void print() {
super.print();
System.out.println(", credits: " + credits);
}
}
指导老师:
public class Instructor extends Person{
private double salary;
public double getSalary() {
return salary;
}
public void setSalary(double newSalary) {
salary = newSalary;
}
public void print() {
super.print();
System.out.println(", salary: " + salary);
}
}
人:
public class Person {
private String name;
private String id;
public String getName() {
return name;
}
public void setName(String replacementName) {
name = replacementName;
}
public String getID() {
return id;
}
public void setID(String id) {
this.id = id;
}
public void print() {
System.out.print(name + ", student ID: " + id);
}
}
主线:
public class Main {
public static void main(String[] args) {
Instructor instructor = new Instructor();
instructor.setName("Hani Javadi");
instructor.setID("888777666");
instructor.setSalary(11111);
instructor.print();
System.out.println("--- --- ---");
Student student1 = new Student();
student1.setName("Joe Loop");
student1.setID("810123456");
student1.addCredits(10);
student1.print();
Student student2 = new Student();
student2.setName("Mary Collection");
student2.setID("811987321");
student2.addCredits(25);
student2.print();
Student student3 = new Student();
student3.setName("Ke Method");
student3.setID("810010101");
student3.print();
}
}
当我去输出这段代码时,结果是这样的:
Hani Javadi, student ID: 888777666, salary: 11111.0
Joe Loop, student ID: 810123456, credits: 10
Mary Collection, student ID: 811987321, credits: 25
Ke Method, student ID: 810010101, credits: 0
但是,输出需要第一行为:
Hani Javadi, instructor ID: 888777666, salary: 11111.0
谁能帮忙解决这个小错误?我已经努力了几个小时,试图通过在超类 Person
中添加 if
语句来找到修复它的方法,但似乎没有任何效果。有没有简单的方法让讲师打印语句显示讲师 ID 而不是学生 ID?
也许您应该将 id
字段的打印完全移动到子 class 中,而不是在父 class 中,这样他们就可以确定适当的领先指标。
哟, 发生这种情况是因为你在 Person class 中得到了 'student ID',它适用于抽象级别
例如,您可以尝试在 Person class:
中使用下一个方法public void print() {
System.out.print(name + ", " + getClass().getName() + " ID: " + id);
}
你的主要问题是,你的 Person
class 说 studentId=...
。这是关于多态性的很好的培训,它已经向您展示了您的方法哪里出了问题。
问题是,Person
不应该有任何 Student
特定的东西。如果它是 Person
的 ID,则应改为 personId=...
。如果 Student
和 Instructor
之间的 ID 完全不同,您需要在这两个 class 中执行这些打印。
多态,继承。这些工具可以做很棒的事情。但如果使用不当,它们会适得其反,这就是你刚刚发生的事情。
现在,说真的,不要那样做:
if (this instanceof Student) {
System.out.print("student ID=" + id)
} else if (this instanceof Instructor) {
System.out.println("instructor ID=" + id);
} else {
// some default here, or I don't know.
}
这绝对有效,但从设计的角度来看,这是一场灾难。 @Skytrace 提到的内容有效,而且几乎没有那么丑陋。但是,它只适用于 class 名称等于您要显示的名称的这种特殊情况。如果有人重构它,将 Student
class 重命名为例如StudentDto
,你会看到StudentDto ID=...
,已经不好看了
在下面的Class人中创建另一个方法
public void print() {
System.out.print(name + ", student ID: " + id);
}
例如
public void print2() {
System.out.print(name + ", Instructor ID: " + id);
}
然后在您的主 class 中调用它作为 instructor.print2();