A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘逍遥 中级黑马   /  2012-6-22 13:03  /  1976 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

实例说话,大家都知道Object是所有类的基类,那么接着看:
public class Object
{
  public Object();          //Object的构造函数
  ........                         //此处省略
}
定义:
public class My:Object  //此处显示的继承
{
   //此处没有构造函数
  public  string  name;   //定义名字字段   
}
请教:
当执行,My  m=new My(); 时
  会不会调用Object的构造函数,会不会产生Object实例!??

评分

参与人数 1技术分 +2 收起 理由
郑文 + 2

查看全部评分

6 个回复

倒序浏览
当执行,My  m=new My(); 时,实例化时系统默认调用无参构造函数,所以也会调用Object的构造函数,但不会产生Object实例。

评分

参与人数 1技术分 +1 收起 理由
郑文 + 1

查看全部评分

回复 使用道具 举报
当然不会啦.派生类在实例化的时候是会调用基类的构造函数,但只会产生派生类自己的实例,不会同时产生基类的实例.
你想想,抽象类也能被继承,但抽象类能随着派生类实例化而实例化出来吗?

评分

参与人数 1技术分 +1 收起 理由
郑文 + 1

查看全部评分

回复 使用道具 举报
许庭洲 发表于 2012-6-22 13:15
当执行,My  m=new My(); 时,实例化时系统默认调用无参构造函数,所以也会调用Object的构造函数,但不会产 ...

CLR会这样执行:  1    为My类天剑默认的构造函数,public My();并执行它,
                         2, 发现 My类继承自Object类,然后CLR会去找Object的构造函数,如果是多层继承的话,会找到Object基类的构造函数,并执行它,然后把控制权交给其调用类,这样层层调用就产生了实例,
       继续请教问题:我可以这样认为:其实是产生了Object实例,只不过它是My实例的一部分,所以我们叫她My实例,而不是Object实例,这样理解对吧?
                       还有实例化的过程中也实例化了父类的私有字段,只不过在子类中不能看到而已,这样认为对吗?
  

                        求解
回复 使用道具 举报
张恒维 发表于 2012-6-22 13:47
当然不会啦.派生类在实例化的时候是会调用基类的构造函数,但只会产生派生类自己的实例,不会同时产生基类的 ...

你好,我是这样认为的:当实例化子类的时候,CLR检测到有继承关系,所以会找父类,一直找到Object类的构造函数,【因为,接口,抽象类等也是间接或直接继承子Object类】然后调用默认构造函数,当然是无参数的,然后层层调用,并把控制权返回给调用端,知道子类的构造函数调用产生了实例对象,在这个过程中是产生了父类的对象,只不过这个父类对象包含在子类实例中,我们叫它子类实例,并不称它是父类对象而已,这样认为正确吗?
回复 使用道具 举报
你好,我是这样认为的:当实例化子类的时候,CLR检测到有继承关系,所以会找父类,一直找到Object类的构造函数,【因为,接口,抽象类等也是间接或直接继承子Object类】然后调用默认构造函数,当然是无参数的,然后层层调用,并把控制权返回给调用端,知道子类的构造函数调用产生了实例对象,在这个过程中是产生了父类的对象,只不过这个父类对象包含在子类实例中,我们叫它子类实例,并不称它是父类对象而已,这样认为正确吗?

{:soso_e128:}好吧,就按你说的,同时产生了基类对象并包含在派生类当中且被称为派生类实例.我还是说抽象类的例子,它能随着派生类实例而实例吗.答案很明显.
好吧.咱再再再退一步说吧.不管抽象类了.直接按你说的object被包含在派生类里了.问题是它能拿来用吗.或者说我们能拿到这个子类实例吗.如果拿不到.那它的存在与否对我们来说有意义吗.{:soso_e128:}
回复 使用道具 举报
张恒维 发表于 2012-6-22 14:26
好吧,就按你说的,同时产生了基类对象并包含在派生类当中且被称为派生类实例.我还是说抽象类 ...

当子类继承抽象类时,必须继承抽象类的所以成员,这个时候抽象类就不再是抽象类了而是一个类,而这个类是可以实例化的,也就是说,当子类继承抽象类的时候:我们可以 这样认为:可以把实现抽象类成员的子类那部分看成一个类,假定叫它中间类,当初始化子类的时候,这个这个中间类和其他类一样根据继承关系,使用构造函数层层继承得到子类实例,其实这个过程有一个叫做var类型推断的过程,也有一个转换的过程,这都是CLR帮我们完成的!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马