子类对象使用父类来进行承接这种问题今天错了一次、如果调用了子类的方法,子类里的方法使用了super来调用父类的方法就会很有迷惑性,下面是例子:
- 在子类的方法中调用super.方法有如下两种情况:
- 子类已经重写了父类中的这个方法,那么就执行这个重写的方法
- 子类没有重写这个父类的方法,就会执行父类中的这个方法,但是在执行过程中是以子类为主体执行
大家可以看下面这段程序,并且写出输出结果:
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就是子类对象使用父类来进行承接的例子。
- 因为我是SubClass类,所有s3.show()方法肯定是进入SubClass类中的show方法
- 在这个方法中调用了super.show(),所以走到了父类SuperClass的show()方法里面
- 可以看到,在父类show方法中,又调用了this.getName方法,但是注意:getName方法已经被子类重写,this所代表的对象是子类,所以调用的是子类的getName方法
- getName方法中调用了getMyClass方法,但是注意:这个方法并没有被子类重写,因此又回到父类****的getMyClass方法中,但是此时this所代表的对象是子类,因此,在这个方法中getSuperclass得到当前对象的父类就是SuperClass,所以打印出来的内容是SuperClass
感想:还是需要认真理解继承和多态的OOP思想