黑马程序员技术交流社区

标题: 构造器Constructor为啥不可override? [打印本页]

作者: 凌晨丶草未眠    时间: 2013-11-3 22:39
标题: 构造器Constructor为啥不可override?
构造器Constructor为啥不可override?
作者: 岁月渲染    时间: 2013-11-3 23:00
constructor,说简单点就是“构造方法”。构造方法的作用就是“为对象的初始化赋值”。override是方法“重写”,而构造方法不能重写,只能“重载”。
作者: 佟嘉豪    时间: 2013-11-3 23:56
首先:你要问自己是否明白两个问题
1、什么是构造器
2、override是什么,以及什么时候需要使用override
本人也查看了网上的评论,虽然说的对,但不是一针见血,因为这个问题本身就有错误,下面是个人的理解:
1、构造器可以理解为构造函数,如果我们在写一个类的时候,不写构造函数,系统会默认声明一个没有参数的构造函数
   这里就不得不提到函数的重载,重载的意思是函数名相同,对应位置的参数类型不一致,就叫函数的重载
所以当我们重新写构造函数的时候,会因为参数的不同,这时候就发生了构造函数的重载
这里要注意:重载是发生在同一个类中的
2、如果一个类继承了另一个类(类AA继承类A)
这时候,如书上所言,本人也不知道为什么  类AA是不会继承类A的构造函数的
这时候类AA的构造函数中,字段的赋值,继承过来的字段是需要通过base(和父类某个构造函数匹配的参数列表),来赋值相应的字段,子类中如果还有其他字段,就要自己赋值了(这里不考虑类A是默认构造函数的情况)
除去构造函数之外,这里就不得不提出override(重写) 重写出现的目的:就是实现了类的三要素中的多态 而且override的出现地方是子类
场景:父类中 有一个fun()方法,实现的是我叫父亲
子类继承了父类,同时也继承了这个方法,但子类想实现:我叫儿子的目的 但不想另写一个方法
就需要重写这个方法,这时候就需要在子类中fun()前面加上override 并重新实现函数体
而override 加的条件是 父类的函数允许重写  1)父类是(abstract修饰的)抽象类 子类继承父类 则必须重写 2)父类中含有(virtual修饰的)方法
如果父类中的函数没有被表示virtual  子类中是不允许override的
综上所述:
1、书上说构造函数是不允许继承的,何来的override
2、抛去构造函数,哪怕是其他函数,如果没有override发生的条件,同样是不允许override的      


作者: 蒋东东    时间: 2013-11-4 01:37
.首先先理解面向对象三大特性。想想下面这个问题。
class Person{}
class Chinese : Person{}
如果Chinese类中的构造方法被重写了,那当你想实例化Chinese的时候程序将不执行Person的构造方法,直接执行Chinese的构造方法,那作为父类的Person中的公共属性谁去初始化?在Chinese构造方法中初始化显然不合理。.Net引入了base关键字,通过base可以直接调用父类的成员。这样就可以在Chinese初始化的同时调用Person的构造函数初始化。
  1. class Chinese : Person
  2. {
  3. public Chinese() : base()
  4. {}
  5. }
复制代码
而普通方法不存在初始化的问题。


作者: hourglass    时间: 2013-11-4 01:51
override的意思是重写,而所谓的重写就是重写继承过来的东西,需要注意的就是,构造方法是不能够被继承的, 所以理所应当的就不能够被重写。
不过,虽然构造函数不能够被继承, 但是你也可以在子类中调用父类的构造函数,通过base关键字。

我觉得我第一句话能解释为什么不能重载构造方法{:soso_e113:}




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2