Number number = new IntNumber();
//究竟调用了谁? 调用基类ShowInfo new的作用是继承类向父类隐藏重写方法。所以是调用父类的ShowInfo 方法
number.ShowInfo();
//究竟调用了谁? 这个是调用子类的方法,因为override已经重写了父类方法,所以调用子类的ShowNumber
number.ShowNumber();
其实在子类中用new和用override还是有点区别的:
如果你用new声明了一个与父类一模一样的方法,其实这个方法就专属于子类,跟父类的那个同名的方法没有任何关联,new嘛,本来就新创建的意思,就为了说明这是我新创建的方法,与你父类无关!如果你把子类当做父类用的话,也就是你上面的这行代码Number number = new IntNumber();那么其实number.ShowInfo()是调用的父类的,并不呈现出多态,和override还是不一样的!当然了,如果你是用子类的调用showInfo()的时候那肯定就是调用的子类的啦IntNumber n = new IntNumber();n.showInfo(),此时调用的子类的方法
总结一下:你用new声明的方法是把父类的方法隐藏了,但是你还是可以调用到的,那就是把子类当做父类来用
另外跟你说一下new和override的区别:
orverride声明的子类方法,父类必须是abstract或是viutual的,而new声明的话没有限制,也就是可以是虚方法也可以什修饰符都不加
override可以覆盖基类的方法,让基类的方法以子类的内容实现,这是真正意义上的重载;而new不用来覆盖基类的方法,而是全新定义一个子类的方法,这个方法只属于子类,与基类的方法无关,只是名字上相同而已。
其实这个代码你自己用断点一步一步跟踪一下就很容易明白谁调用了谁的