可以在看看多态的实现机制:父类的引用变量可以指向子类的实例对象,而程序调用的方法在运行期间才动态绑定,就是引用变量所指向真正实例对象的方法,也就是内存中正在运行的那个对象的方法,而不是引用变量的类型里定义的方法
举个例子:- public class Father {
- public void method1(){
- System.out.println("father-->method1");
- }
- public void method2(){
- System.out.println("father-->method2");
- }
- public void method3(){
- System.out.println("father-->method3");
- }
- }
复制代码- public class Son extends Father {
- //从父类继承的方法
- public void method1(){
- System.out.println("son继承father-->method1");
- }
- public void method2(){
- System.out.println("son继承father-->method1");
- }
-
- //子类特有的方法
- public void method4(){
- System.out.println("son-->method3");
- }
- }
复制代码 测试:
- public class TestDemo {
- /**
- * @param args
- */
- public static void main(String[] args) {
- Father f = new Son();
- /*编译的时候,父类虽然指向子类的实例对象,但是程序调用的方法在运行期间才动态绑定
- * 也是就是在编译阶段父类时不知道子类有什么方法的,父类的对象也知道调用父类里面的方法
- * 而无法调用子类的里面的方法,在运行的时候,父类对象调用的方法,如果子类继承并重写了父类的
- * 方法,就会调用子类覆写的方法,如果子类没有覆写父类方法,父类对象再调用的时候只会调用本身的方法
- * 为了调用子类特有的方法,必须将对象向下转型
- */
- f.method1();
- f.method2();
- f.method3();
- /*
- * method3是子类特有的方法,要想调用该方法,必须对象向下转型
- * */
- if(f instanceof Son){
- Son s = (Son)f;
- s.method4();
- }
- }
- }
复制代码 测试结果:
son继承father-->method1
son继承father-->method1
father-->method3
son-->method3
对于对象多态,可以简单的使用 编译看左边、运行看右边
就是编译时调用的方法只能是左边对象里面的方法,运行的时候是调用右边对象里面覆写的方法,如果没有覆写就会继续调用左边对象的方法
|