当有一个父类和一个子类时,一般情况下父类不会知道子类的存在,不会调用子类的方法。但有时候确有需要,比如在多态的情况下,需要在编译时绑定父类的方法,在运行时动态绑定子类的方法。下面就来具体讲解一下如何实现父类调用子类的方法。
1. 使用抽象方法实现父类调用子类的方法
抽象方法是一种没有实现的方法,只有方法声明,抽象方法必须在抽象类中声明。如果子类继承了这个抽象类,那么子类必须要实现这个抽象方法,这样就能实现父类调用子类的方法的需求。具体的过程是:
在父类中定义一个抽象方法。
在子类中重写这个抽象方法,子类中的方法就是要被父类调用的方法。
在父类中,创建一个方法,方法中调用抽象方法。
在子类中,重写这个方法,重写的方法中可以调用自己的方法
abstract class Parent {
abstract void testMethod(); //定义抽象方法
void callMethod() {
testMethod(); //调用抽象方法
}
}
class Child extends Parent {
void testMethod() {
System.out.println("这是子类的方法");
}
void callMethod() {
super.callMethod(); //调用父类方法,执行父类的testMethod,实际执行的是子类的testMethod
}
}
2. 利用多态实现父类调用子类的方法
在父类中定义一个方法,但是方法中的操作不能确定是什么,这样可以让子类继承这个方法,子类可以重写这个方法,实现自己的操作。这就是多态的应用。具体的过程是:
在父类中定义一个方法。
在子类中重写这个方法,所写的方法是父类定义的方法的子类实现。
在父类和子类外面的某个地方,创建一个指向子类的引用,将这个引用存储到父类的引用中。
在父类中,调用这个方法。
在运行时,由于多态的原理,实际调用的是子类的方法。
class Parent {
void testMethod() { //定义一个方法
System.out.println("这是父类的方法");
}
}
class Child extends Parent {
void testMethod() { //重写方法
System.out.println("这是子类的方法");
}
}
public class Test {
public static void main(String[] args) {
Parent p = new Child(); //创建一个指向子类的引用
p.testMethod(); //调用父类的方法,实际调用子类的方法
}
}