代码如下:
调用如下:
结果:
我的理解应该只有一次调用为什么会有两次调用,调用B类的方法,应该先是调用b的无惨构造方法给y赋值1,然后在调用B类中从写的OutputText方法,求解为什么有两次,求高人指点。
以下为 A a= new B(); 执行完成后输出:
在实例化子类B 的时候, 会按照继承顺序 实例化所有B的基类. 所以 new B() 执行的时候,首先执行A的构造函数,执行OutputText(), 但A的OutputText() 方法是虚方法,被B 重写, 所以 执行B的 OutputText() 方法, 输出第一句 x+y=0;
以下是a.OutputText();执行后输出:
调用B的OutputText() 方法 输出 第二句 x+y=1.
因为B是继承自A,所以在进行B的构造函数之前会先走A的构造函数,你可以用VS加断点调试一下,一步一步跟着程序走走试试。我给你调试看看。。。我也是个新手
你这个定义的对象a是指向子类的,调用的时候会先调用父类的无参构造函数,然后再调用子类的无参构造函数,最后调用子类的outputText方法(为什么调用子类的方法你应该知道吧)
语法常识1:一个类在生成实例时.总会执行某一个构造函数.不执行构造函数就没有实例
从调试中可以看到是调用了两次输出,第一次x,y的值均为0,然后调用了一次输输出函数,当程序第二次进入B类后y的值为1,再次调用了override的方法,输出x+y的值为1,所以最后输出了2次,你调试一下,看看能明白不?
但是还有一点不明白的就是,子类继承父类,在new的时候要调用父类的构造函数,但是在调用父类的构造函数时候,当构造函数调用方法的时候,为什么调用的是子类重写的方法不是父类的方法了,是不是在new的时候就以及把父类的方法替换了。