一个展示Java类继承子父类之间方法调用关系的例子及其分析

子类对象使用父类来进行承接这种问题今天错了一次、如果调用了子类的方法,子类里的方法使用了super来调用父类的方法就会很有迷惑性,下面是例子:

  • 在子类的方法中调用super.方法有如下两种情况:
  1. 子类已经重写了父类中的这个方法,那么就执行这个重写的方法
  2. 子类没有重写这个父类的方法,就会执行父类中的这个方法,但是在执行过程中是以子类为主体执行

大家可以看下面这段程序,并且写出输出结果:

public class Main {
    public static void main(String[] args) {

        // SuperClass s1 = new SuperClass();
        // s1.show();

        // SubClass s2 = new SubClass();
        // s2.show();

        SuperClass s3 = new SubClass();
        s3.show();
    }
}

class SuperClass{

    void show(){
        System.out.println("super class");
        this.getName();
    }

    void getName(){
        System.out.println("in SuperClass");
        this.getMyClass();
    }

    void getMyClass(){
        System.out.println(this.getClass().getSuperclass().getName());
    }
}

class SubClass extends SuperClass{
    void show(){
        System.out.println("sub class");
        super.show();
    }

    void getName(){
        System.out.println("in SubClass");
        this.getMyClass();
    }
    // 注意:SubClass并没有重写getMyClass方法
}

上面程序s3.show()的输出结果:
sub class
super class
in SubClass
SuperClass

分析:

只分析s3那种情况的,s3就是子类对象使用父类来进行承接的例子。

  1. 因为我是SubClass类,所有s3.show()方法肯定是进入SubClass类中的show方法
  2. 在这个方法中调用了super.show(),所以走到了父类SuperClass的show()方法里面
  3. 可以看到,在父类show方法中,又调用了this.getName方法,但是注意:getName方法已经被子类重写,this所代表的对象是子类,所以调用的是子类的getName方法
  4. getName方法中调用了getMyClass方法,但是注意:这个方法并没有被子类重写,因此又回到父类****的getMyClass方法中,但是此时this所代表的对象是子类,因此,在这个方法中getSuperclass得到当前对象的父类就是SuperClass,所以打印出来的内容是SuperClass

感想:还是需要认真理解继承和多态的OOP思想

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章