如何从Superclass方法调用Subclass方法?

时间:2016-03-30 14:26:54

标签: java java-7

我正在努力制作一个程序,根据他们的总分来准备学生的优秀名单。如果两个学生的总分相同,则检查不同科目的个别分数。

第40行我试图从超类方法的定义中调用子类方法,但我收到错误。

import java.util.*;


class Student{
int[] ph, ch, ma;
int[] total;
int[] total_sort;

Student(){}

// length of array and marks are received via constructor.
Student(int x, int[] p, int[] c, int[] m){

    // an array of p,c,m along with 2 arrays of total marks is made.
    total = new int[x];
    total_sort = new int[x];
    ph = new int[x];
    ch = new int[x];
    ma = new int[x];
    for(int i = 0; i < x; i++){ 
        ph[i] = p[i];
        ch[i] = c[i];
        ma[i] = m[i];
        total[i] = (p[i] + c[i] + m[i]);
        total_sort[i] = total[i];
    }

}

// sorts the array accoring to the total marks
void Sort(){

    for(int f = 0; f < total.length; f++){

        if(total[f] > total[f+1])
            total_sort[f] = total[f];

        // checks for higher maths marks.
        else if(total[f] == total[f+1]){
            int m = Stud_new.mSort(f);
            total_sort[f] = total[m];
        }   

    }
}

/* returns the index from original total array so as to identify the         students' name.
 * marks from sorted array are compared with original array to find the   index of marks in originial array .
 * this index is used to find the students' name.
 */
int GetList(int a){


        for(int j = 0; j < total.length; j++){

            if(total[j] == a)
                return j;
        }


    return -1 ;

}

}

class Stud_new extends Student{

int cSort(int ci){
    if(ch[ci] > ch[ci + 1])
        return ci;

    else if(ch[ci] < ch[ci + 1])
        return (ci + 1);

    //else if(ph[pi] == ph[pi + 1])
        //csort(pi);
}

int pSort(int pi){

    if(ph[pi] > ph[pi + 1])
        return pi;

    else if(ph[pi] < ph[pi + 1])
        return (pi + 1);

    else if(ph[pi] == ph[pi + 1])
        return(cSort(pi));
}

int mSort(int mi){

    if(ma[mi] > ma[mi + 1])
        return mi;

    else if(ma[mi] < ma[mi + 1])
        return (mi + 1);

    // checks higher phy marks
    else if(ma[mi] == ma[mi + 1])
        return(pSort(mi));
}

}

class Mlist{

public static void main(String args[]){

    // initializes the names and marks.
    String[] name = {"foo", "bar", "baz"};
    int[] phy = {80,112,100};
    int[] chem = {100,120,88};
    int[] maths = {40, 68,60};

    Student stud = new Student(name.length, phy, chem, maths);

    System.out.println("Name\tPhysics\tChemistry\tMaths\tName");

    // prints the merit list
    for(int i = 0; i < name.length; i++){

        // index of name is received by a function call

        /* STUD.TOTAL_SORT[i] IS STUDENTS' MARKS IN SORTED MANNER.
         * THIS IS PASSED AS AN ARGUMENT TO GETLIST METHOD WHICH USES LINEAR SEARCH
         * TO FIND THE INDEX IN THE ARRAY OF NAMES FOR THE STUDENT WHOSE MARKS IS PASSES
         * THE FUNCTION RETURNS INT WHICH IS THE INDEX FOR NAME[] ARRAY. and others all well.
         * HERE STUD.TOTAL_SORT[I] IS AN ARGUMENT TO THE FUNCTION STUD.GETLIST() WHICH RETURNS AN INT            
         */
          System.out.println(name[stud.GetList(stud.total_sort[i])]+"\t"+phy[stud.GetList(stud.total_sort[i])]+"\t"+chem[stud.GetList(stud.total_sort[i])]+"\t"+maths[stud.GetList(stud.total_sort[i])]+"\t"+stud.total_sort[i]);
    }


}

}

2 个答案:

答案 0 :(得分:0)

您可能正在寻找Factory方法模式解决方案。请谷歌查看更多详细信息,但简单地说,您希望Student类是抽象的并添加抽象mSort方法,然后在Stud_new类中实现该方法。然后你必须实例化Stud_new对象。

提示:你可以这样做:

Student stud = new Stud_new(name.length, phy, chem, maths);

这远非完美的解决方案,但是这个解决方案允许您从超类中的子类调用方法,这正是您所要求的。

答案 1 :(得分:0)

从超类方法调用子类方法是不可能的,也是错误的。

这违反了继承规则。

超类表示一种常见行为,而子类具有其超类不可见的特定行为。