有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

继承,子类,使用超级打印。Java中的print()

我有四门不同的课。一个标题为Student,一个标题为Instructor,一个标题为PersonMain。下面是我的代码:

学生:

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

}

Main:

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


共 (4) 个答案

  1. # 1 楼答案

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

    问题是,Person不应该有任何Student特定的东西。如果它是一个Person的ID,它应该改为personId=...。如果ID在StudentInstructor之间完全不同,则需要在这两个类中进行这些打印

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


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

    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=...,这不再是好事

  2. # 2 楼答案

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

  3. # 3 楼答案

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

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

    例如

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

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

  4. # 4 楼答案

    哟, 这是因为你在Person类中获得了“student ID”,它在抽象级别上起作用

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

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