Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
继承,子类,在Java中使用super.print()打印_Java_Inheritance_Printing_Polymorphism_Super - Fatal编程技术网

继承,子类,在Java中使用super.print()打印

继承,子类,在Java中使用super.print()打印,java,inheritance,printing,polymorphism,super,Java,Inheritance,Printing,Polymorphism,Super,我有四门不同的课。一个名为Student,一个名为讲师,一个名为Person和Main。下面是我的代码: 学生: public class Student extends Person { public void print() { super.print(); System.out.println(", credits: " + credits); } } 讲师: public class Instructor extends Person{ private double s

我有四门不同的课。一个名为
Student
,一个名为
讲师
,一个名为
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();
}

}
人:

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

}
Main:

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

}
当我去输出这段代码时,结果是:

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

}

但是,输出需要有第一行:

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

}



谁能帮我解决这个小错误?我花了几个小时的时间试图找到一种解决方法,在超类
Person
中添加一个
if
语句,但似乎没有任何效果。有没有一种简单的方法使讲师打印语句显示讲师ID而不是学生ID?

也许您应该将
ID
字段的打印完全移动到子类中,而不是父类中,这样他们就可以确定适当的前导指示器。

Yo, 发生这种情况是因为您在Person类中获得了“student ID”,它在抽象级别上工作

例如,您可以尝试在Person类中使用下一种方法:

public void print() {
    System.out.print(name + ", " + getClass().getName() + "  ID: " + id);
}

你的主要问题是,你的
Person
班级说
studentId=…
。这是一个关于多态性的很好的培训,它已经向您展示了您的方法哪里出了问题

问题是,
不应该有任何特定于学生的东西。如果它是一个
人的ID
,那么应该改为
人名=…
。如果
学生
讲师
之间的ID完全不同,则需要在这两个类中进行打印

多态性,遗传。这些工具可以做很棒的事情。但如果使用不当,它们可能适得其反,这就是刚刚发生在你身上的事情


现在,说真的,不要这样做:

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提到的方法很有效,甚至没有那么难看。然而,它只在类名等于您想要显示的类名的特殊情况下才起作用。如果有人重构它,将
Student
类重命名为例如
StudentDto
,您将看到
StudentDto ID=…
,这不再好了。

在下面的类Person中创建另一个方法

   public void print() {
    System.out.print(name + ", student ID: " + id);
    }
e、 g

然后在你的主课上把它叫做
print2()

如果讲师实例不应打印学生Id,则讲师不是个人,或者个人不应打印学生Id。在
个人
中使
打印
完全抽象如何?目前它有学生特有的行为,这对于基类来说是错误的。扩展具体的类通常是不好的做法。你的问题就是一个很好的例子。正如其他人所建议的,如果
Person
是一个具体的类,那么它需要说“personid:”。否则,它需要是一个抽象类,具有返回职业的抽象方法,该职业将用于您的
print
方法,或者允许子类完全覆盖
print
方法。@tsolakp为什么您认为扩展具体类(通常)是一个坏主意?您可以搜索此主题。但这里有一些。1) 重点是什么?若您需要定义一个类型,那个么只需使用接口即可。如果您想定义共享行为,那么就使用抽象类(我称之为模板)2)有人可以修改具体的类,而不会意识到它是基类,并且会给所有子类带来副作用。3) 没有办法强迫子类提供特定的行为,子类也不知道要实现什么方法,因为所有方法都是具体的。使用抽象类,您可以定义子类需要实现的抽象方法。这不是一个好主意,因为OP现在必须知道
人的类型。解决方案应该包括超越
print()
。然后你可以通过回答别人的问题来帮助别人。如果您想/需要在StackOverflow之前获得分数,请尝试编辑其他人的问题和/或答案,修复打字错误和格式。这个答案对任何人都没有帮助。谢谢!我很难处理抽象类,这很有帮助。