使用继承

时间:2015-11-08 23:47:01

标签: java inheritance override

我目前正在学习java中的继承。我有一个叫做学生的超类UndergradStudents& GraduateStudents。它们都有一个名为deansHonourList的方法。在undergrad deansHonourList方法中,它检查GPA是否大于3.5以符合deans列表,对于研究生子类,gpa必须大于3.75,我必须删除子类中的方法并在超类中创建一个方法确定学生是否有资格获得院长荣誉名单。到目前为止,这是我的代码。

 import java.io.*;

public class Activity6C {
    public static void main(String[] args) {
        Student[] students = new Student[4];

        students[0] = new UndergradStudent(8032, "Casper", 2.78, 2);
        students[1] = new GraduateStudent(3044, "Sheena", 3.92, "Natural Language Processing");
        students[2] = new UndergradStudent(6170, "Yolanda", 4.26, 3);
        students[3] = new GraduateStudent(1755, "Geordi", 3.58, "Human-Computer Interaction");

        printStudents(students);
        printDeansList(students);

        System.out.println("\nEnd of processing.");
    }

    public static void printStudents(Student[] students) {
        System.out.println("\nList of all students:\n");
        for (int i = 0; i < students.length; i++) {
            System.out.println(i + 1 + ": " + students[i]);
        }
    }

    public static void printDeansList(Student[] students) {
        System.out.println("\nDean's honour list:\n");
        for (int i = 0; i < students.length; i++) {
            if (students[i].deansHonourList()) {
                System.out.println(students[i]);
            }
        }
    }
 }

 class Student {
    private int number;
    private String name;
    private double gpa;

    public Student(int number, String name, double gpa) {
        this.number = number;
        this.name = name;
        this.gpa = gpa;
    }

    public double getGPA() {
        return gpa;
    }

    public boolean deansHonourList() {
        //Here is where i make my code to determine honour list students
        return false;
    }

    public String toString() {
        return number + " " + name + " (" + gpa + ")";
    }
 }

 class UndergradStudent extends Student {
    private int year;

    public UndergradStudent(int number, String name, double gpa, int year)   {
        super(number, name, gpa);
        this.year = year;
    }

    public boolean deansHonourList() {
        boolean result = false;
        if (getGPA() >= 3.5)
            result = true;
        return result;
    }

    public String toString() {
        return "Undergraduate: " + super.toString() + " year: " + year;
    }
 }

 class GraduateStudent extends Student {
    private String thesis;

    public GraduateStudent(int number, String name, double gpa, String       thesis) {
        super(number, name, gpa);
        this.thesis = thesis;
    }

    public boolean deansHonourList() {
        boolean result = false;
        if (getGPA() >= 3.75)
            result = true;
        return result;
    }

    public String toString() {
        return "Graduate: " + super.toString() + " thesis: " + thesis;
    }
 }

注意:这是一项练习,但它不值得,但我想在正确的方向上提示。这是问题也指明的内容。

我必须在不使用instanceof或getClass()的情况下使其工作,并且不再添加if-else语句或实例变量。在GraduateStudent或UndergraduateStudent中不应该有deansHonourList()方法,并且可以删除getGPA()方法。

我得到的提示是将另一个实例方法添加到超类中并根据需要在子类中重写它;在deansHonourList()方法中调用该方法。

我无法想办法做到这一点。我的意思是我可以在新的实例方法中添加什么,然后在子类中覆盖它。

感谢您阅读我的问题或您能给我的任何提示。

3 个答案:

答案 0 :(得分:0)

你需要一个(可能是抽象的)方法,它返回可以考虑用于荣誉列表的最低GPA分数,可能类似

if(!isset($_SESSION['user_timezone'])){ // if timezone isn't set
session_start(); // start session
$_SESSION['user_timezone'] = $_GET['user_day'];}
if($_SESSION['user_timezone']===1){ // if it's the first of December
echo 'Im shown December first';} else if($_SESSION['user_timezone']===2){ // if it's the second of December
echo 'Im shown December second';}

然后你可以实现像...这样的事情。

abstract class Student {

    private int number;
    private String name;
    private double gpa;

    public Student(int number, String name, double gpa) {
        this.number = number;
        this.name = name;
        this.gpa = gpa;
    }

    public double getGPA() {
        return gpa;
    }

    public abstract double getMinimumHonourListGPA();

    public boolean deansHonourList() {
        boolean result = false;
        if (getGPA() >= getMinimumHonourListGPA()) {
            result = true;
        }
        return result;
    }

    public String toString() {
        return number + " " + name + " (" + gpa + ")";
    }
}

现在,如果这是不可接受的,您需要通过构造函数将最低GPA分数传递给父类,例如......

class UndergradStudent extends Student {

    private int year;

    public UndergradStudent(int number, String name, double gpa, int year) {
        super(number, name, gpa);
        this.year = year;
    }

    public String toString() {
        return "Undergraduate: " + super.toString() + " year: " + year;
    }

    @Override
    public double getMinimumHonourListGPA() {
        return 3.5;
    }
}

例如

答案 1 :(得分:0)

好的,如果你有一个方法&#39; requiredGPA()&#39;,它返回了获得Deans Honor List所需的GPA怎么办?

然后,您将在子类中重写此方法以返回其不同的要求,超类的deansHonourList()将使用此方法返回的值来确定学生是否在列表中?

如果需要,我可以给出一个代码示例...如果我在这个答案中没有明白,请告诉我?

编辑 - 看起来MadProgrammer已经达到了我想要的目标。

答案 2 :(得分:0)

这是Facade设计模式的一个例子。 检查here

这种模式是提供一个简单的界面来隐藏底层的复杂性。接口用于调用单个接口,在运行期间,JVM将确定调用哪个方法。此方法由调用方法的对象的实现类确定。

在您的情况下,学生将作为界面工作。正如其他人建议您可以使用抽象方法 deansHonourList 的抽象类,或者您可以使用空实现。

现在假设我们在所有三个类中都有空构造函数。

Student student1 = new Student();
Student student2 = new UnderGraduateStudent();
Student student3 = new GraduateStudent();

由于父类引用变量可以包含子类的实例,因此我们可以将UnderGraduateStudent和GraduateStudent的对象分配给Student类型引用变量。

所有这三个类都有方法 deansHonourList 。 当我们在所有三个对象上调用此方法时,如下所示

student1.deansHonourList(arguments...)
student2.deansHonourList(arguments...)
student3.deansHonourList(arguments...)

JVM将通过检查student1,student2,student3实例的类型来找到它必须从中调用方法的正确类。

将只调用其中一个方法(与在子类构造函数中调用超类构造函数的构造函数不同)。

即使在父类引用上调用deansHonourList,也会调用子类中的方法,因为引用包含子类实例。 这称为方法覆盖

检查this

覆盖仅在非静态方法的情况下有效,在静态方法的情况下,调用父类方法。由于静态成员是类的一部分而不是类实例,因此实例在方法解析中不起作用。 这称为方法隐藏