zoukankan      html  css  js  c++  java
  • 在多态的情况下,在父类的构造器中运行子类的重写方法问题

    问题:

    在测试类中创建一个多态 Base b2 = new Sub();

    结果在父类的构造器方法中调用的method重写方法,调用的却是子类的,这是为什么?

    看以下代码:

    public class Test01 {
        public static void main(String[] args) {
            /*
            1.new 的是父类对象,走父类构造
            直接调用了父类的method
            输出 base:100
            */
            Base b1 = new Base();
            /*
            2.多态new对象  new了子类对象 执行子类无参时先走父类无参构造
            此时父类中无参构造调用的method为重写后的method,然后传了一个100
            所以先输出 sub:100
    
            然后再执行super.method(70)调用父类method,并传递70
            所以输出 base:70
            */
            Base b2 = new Sub();
            System.out.println(b2.getClass());
        }
    }
    public class Sub extends Base{
        Sub() {super.method(70);
        }
    
        public void method(int j) {
            System.out.println("sub : " + j);
        }
    }
    public class Base {
        Base() {
            method(100);
        }
    
        public void method(int i) {
            System.out.println("base : " + i);
        }
    }

    以上方法执行的顺序是:

    1、base : 100
    2、sub : 100
    3、base : 70
    4、class Sub

    在父类的构造器中跳转的方法是子类的是因为,new的运行类型是Sub(),所以执行的方法就是Sub类中的方法。

    多态运行的方法只和=左边的运行类型有关,也就是你new的谁就去调谁的方法

    如果new的对象中没有,由于有继承关系就会去父类中寻找,这其实是属于多态的动态绑定机制

    并且调用不了父类中的 private属性变量和方法

    还可以借鉴一下别人的文章

    Java 父类构造函数中调用子类重写的方法

    java基础学习总结——多态(动态绑定)(写的很好,值得看)

  • 相关阅读:
    去除图片水印
    CALayer
    UIKit Animation
    CoreAnimation
    3DTouch
    键盘事件
    weChat聊天发送图片带有小尖角的实现
    webView 和 js 交互 之 屏蔽 样式
    iOS socket编程
    tableView尾部多处一部分空白高度
  • 原文地址:https://www.cnblogs.com/MoonASixpence/p/14842604.html
Copyright © 2011-2022 走看看