我想使用向下造型。虽然结果是正确的但是我被自己的代码弄晕了!!

class Student{
private String name;
private int classA,classB,classC;
public Student(String n,int a,int b,int c){
name=n;
classA=a;
classB=b;
classC=c;
}
public String getName(){
return name;
}
public int getAverage(){
return (classA+classB+classC)/3;
}
}
class UnderGraduate extends Student{
public UnderGraduate(String n,int a,int b,int c){
super(n,a,b,c);
}
public void isPass(Student a1){
if(a1 instanceof UnderGraduate){
UnderGraduate a=(UnderGraduate)a1;
System.out.println(a.getAverage());
}
if(getAverage()>60)
System.out.println("本科生"+getName()+"的三科平均分为:"+getAverage()+
",可以拿到学士学位。");
else
System.out.println("本科生"+getName()+"的三科平均分为:"+getAverage()+
",不能拿到学士学位。");
}
}
class PostGraduate extends Student{
public PostGraduate(String n,int a,int b,int c){
super(n,a,b,c);
}
public void isPass(Student b1){
if(b1 instanceof PostGraduate){
PostGraduate b=(PostGraduate)b1;
System.out.println(b.getAverage());
}
if(getAverage()>80)
System.out.println("研究生"+getName()+"的三科平均分为:"+getAverage()+
",可以拿到硕士学位。");
else
System.out.println("研究生"+getName()+"的三科平均分为:"+getAverage()+
",不可以拿到硕士学位。");
}
}
public class StudentGradeDemo{
public static void main(String[] args){
StudentGradeDemo t=new StudentGradeDemo();
UnderGraduate a2=new UnderGraduate("张三",80,80,80);
PostGraduate b2=new PostGraduate("李四",90,90,90);
a2.isPass(b2);//这里是什么意思我晕了!!
b2.isPass(a2);//这里是什么意思我晕了!!

        }
    }

对关键行加了注释,看一下应该能理解。

class Student {
    private String name;
    private int classA, classB, classC;

    public Student(String n, int a, int b, int c) {
        name = n;
        classA = a;
        classB = b;
        classC = c;
    }

    public String getName() {//子类会继承此函数
        return name;
    }

    public int getAverage() {//子类会继承此函数
        return (classA + classB + classC) / 3;
    }
}

class UnderGraduate extends Student {
    public UnderGraduate(String n, int a, int b, int c) {
        //调用其类的构造函数,并传入参数: "张三", 80, 80, 80
        super(n, a, b, c); 
    }

    public void isPass(Student a1) {
        if (a1 instanceof UnderGraduate) { //此条件不满足,if分支不执行
            UnderGraduate a = (UnderGraduate) a1;
            System.out.println(a.getAverage());
        }
        if (getAverage() > 60)
//由传入的参数: "张三", 80, 80, 80调用基类getAverage、getName函数得到 结果为:
//本科生张三的三科平均分为:80,可以拿到学士学位。
            System.out.println("本科生" + getName() + "的三科平均分为:" + getAverage() + ",可以拿到学士学位。");
        else
            System.out.println("本科生" + getName() + "的三科平均分为:" + getAverage() + ",不能拿到学士学位。");
    }
}

class PostGraduate extends Student {
    public PostGraduate(String n, int a, int b, int c) {
        //调用其类的构造函数,并传入参数: "李四", 90, 90, 90
        super(n, a, b, c);
    }

    public void isPass(Student b1) {
        if (b1 instanceof PostGraduate) { //此条件不满足,if分支不执行
            PostGraduate b = (PostGraduate) b1;
            System.out.println(b.getAverage());
        }
        if (getAverage() > 80)
            //由传入的参数:"李四", 90, 90, 90调用基类getAverage、getName函数得到 结果为:
            //研究生李四的三科平均分为:90,可以拿到硕士学位。
            System.out.println("研究生" + getName() + "的三科平均分为:" + getAverage() + ",可以拿到硕士学位。");
        else
            System.out.println("研究生" + getName() + "的三科平均分为:" + getAverage() + ",不可以拿到硕士学位。");
    }
}

public class StudentGradeDemo {
    public static void main(String[] args) {
        StudentGradeDemo t = new StudentGradeDemo();
        UnderGraduate a2 = new UnderGraduate("张三", 80, 80, 80);
        PostGraduate b2 = new PostGraduate("李四", 90, 90, 90);
        a2.isPass(b2);//调用UnderGraduate.isPass函数
        b2.isPass(a2);//调用PostGraduate.isPass函数
    }
}

调用哪个,看a2 b2的实际类型(new初始化的类型)。