使用继承简化java程序
我目前正在学习java中的继承。我有一个名为“学生”的超类,其子类为本科生和研究生。它们都有一个称为deansHonourList的方法。在本科生院长荣誉列表方法中,它检查GPA是否大于3.5以符合院长名单的要求,对于毕业生子类,GPA必须大于3.75,我必须删除子类中的方法,并在超类中创建一个方法,以确定学生是否符合院长荣誉列表的要求。这是到目前为止我的代码使用继承简化java程序,java,inheritance,overriding,Java,Inheritance,Overriding,我目前正在学习java中的继承。我有一个名为“学生”的超类,其子类为本科生和研究生。它们都有一个称为deansHonourList的方法。在本科生院长荣誉列表方法中,它检查GPA是否大于3.5以符合院长名单的要求,对于毕业生子类,GPA必须大于3.75,我必须删除子类中的方法,并在超类中创建一个方法,以确定学生是否符合院长荣誉列表的要求。这是到目前为止我的代码 import java.io.*; public class Activity6C { public static void
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;
}
}
import java.io.*;
公共课堂活动6c{
公共静态void main(字符串[]args){
学生[]学生=新生[4];
学生[0]=新本科生(8032,“卡斯珀”,2.78,2);
学生[1]=新研究生(3044,“Sheena”,3.92,“自然语言处理”);
学生[2]=新的本科生(6170,“约兰达”,4.26,3);
学生[3]=应届研究生(1755,“乔治迪”,3.58,“人机交互”);
学生(学生);
印刷系主任(学生);
System.out.println(“\n处理日期”);
}
公共静态学生(学生[]学生){
System.out.println(“\n所有学生列表:\n”);
for(int i=0;i=3.5)
结果=真;
返回结果;
}
公共字符串toString(){
返回“本科:+super.toString()+”年份:+year;
}
}
班级研究生{
私有字符串论文;
公共研究生(整数,字符串名称,双gpa,字符串论文){
超级(编号、名称、gpa);
这篇论文=论文;
}
公共布尔deansHonourList(){
布尔结果=假;
如果(getGPA()>=3.75)
结果=真;
返回结果;
}
公共字符串toString(){
return“Graduate:+super.toString()+”论文:+论文;
}
}
注意:这是一个练习,它不值得太多,但我想得到一个正确方向的提示。以下是问题还具体说明的内容
我必须在不使用instanceof或getClass()的情况下使其工作,并且不添加任何if-else语句或实例变量。在研究生或本科生中都不应该有deansHonourList()方法,并且可以删除getGPA()方法
我得到的提示是向超类添加另一个实例方法,并根据需要在子类中重写它;在deansHonourList()方法中调用该方法
我想不出一个办法。我的意思是,我可以在我将要创建的新实例方法中放入什么,然后在子类中重写它 感谢您阅读我的问题或您能给我的任何提示。您需要一个(可能是抽象的)方法,该方法返回可被考虑列入荣誉名单的最低GPA分数,可能类似于
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 + ")";
}
}
然后你可以实现做一些像
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;
}
}
class Student {
private int number;
private String name;
private double gpa;
private double minimumHonourListGPA;
public Student(int number, String name, double gpa, double minimumHonourListGPA) {
this.number = number;
this.name = name;
this.gpa = gpa;
this.minimumHonourListGPA;
}
public double getGPA() {
return gpa;
}
public boolean deansHonourList() {
boolean result = false;
if (getGPA() >= minimumHonourListGPA) {
result = true;
}
return result;
}
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, 3.5);
this.year = year;
}
public String toString() {
return "Undergraduate: " + super.toString() + " year: " + year;
}
}
现在,如果这是不可接受的,您将需要通过构造函数将最低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;
}
}
class Student {
private int number;
private String name;
private double gpa;
private double minimumHonourListGPA;
public Student(int number, String name, double gpa, double minimumHonourListGPA) {
this.number = number;
this.name = name;
this.gpa = gpa;
this.minimumHonourListGPA;
}
public double getGPA() {
return gpa;
}
public boolean deansHonourList() {
boolean result = false;
if (getGPA() >= minimumHonourListGPA) {
result = true;
}
return result;
}
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, 3.5);
this.year = year;
}
public String toString() {
return "Undergraduate: " + super.toString() + " year: " + year;
}
}
例如好的,如果您有一个方法'requiredGPA()',该方法返回进入院长荣誉名单所需的GPA,该怎么办 然后在子类中重写此方法以返回其不同的需求,超类的deansHonourList()将使用此方法返回的值来确定学生是否在列表中 如果需要,我可以给出一个代码示例。。。如果我的回答不清楚,请告诉我
编辑-看起来程序员已经找到了我想要的想法。这是立面设计模式的一个例子。 检查 这个模式是关于提供一个简单的接口来隐藏潜在的复杂性。接口用于调用单个函数,在运行时JVM将决定调用哪个方法。此方法由调用方法的对象的实现类确定 在您的情况下,学生将作为接口工作。正如其他人所建议的那样,您可以使用抽象方法deansHonourList的抽象类,也可以使用空实现 现在假设我们在所有三个类中都有空构造函数
Student student1 = new Student();
Student student2 = new UnderGraduateStudent();
Student student3 = new GraduateStudent();
因为父类引用变量可以保存子类的实例,所以我们可以将本科生和研究生的对象分配给学生类型引用变量
这三个类都有方法deansHonourList。
当我们对所有三个对象调用此方法时,如下所示
student1.deansHonourList(arguments...)
student2.deansHonourList(arguments...)
student3.deansHonourList(arguments...)
JVM将找到它必须从中调用metho的正确类