黑马程序员技术交流社区

标题: 关于this 和 base 关键字 [打印本页]

作者: 钱灿    时间: 2012-7-8 20:29
标题: 关于this 和 base 关键字
本帖最后由 钱灿 于 2012-7-8 23:46 编辑

类:
    public class BaseClass
    {
        public BaseClass()
        {
        }
        public BaseClass(int i)
        {
        }
    }

    public class MyClass : BaseClass
    {
        public MyClass() : this(2, 3)
        {
        }
        public MyClass(int i)
        {
        }
        public MyClass(int i, int j) : base(i)
        {
        }
    }

实例化:
MyClass myObj = new MyClass(1, 2);
他们的执行序列是怎么一回事???
---------------------------------------------

测试了下……结果是public BaseClass(int i)与public MyClass(int i, int j)调用过……参数i为1,j为2……那么public MyClass() : this(2, 3)有啥子用呢?


作者: 小高    时间: 2012-7-8 22:22
class a
{
    public a():this(1)//当调用无参数构造函数的时候使用1调用下面那个重载
   {}
   public a(int i)
   {}
}

base的意思差不多,,不过不是调用这个类的,而是调用父类的构造函数
作者: 钱灿    时间: 2012-7-8 22:41
本帖最后由 钱灿 于 2012-7-8 23:03 编辑
小高 发表于 2012-7-8 22:22
class a
{
    public a():this(1)//当调用无参数构造函数的时候使用1调用下面那个重载

public a():this(1)//当调用无参数构造函数的时候使用1调用下面那个重载

————————————
调用过后……还会不会接着调用public a(){}这个呢……我看网上是这个样子……有点晕……

————————————
我理解的顺序是public BaseClass(int 1) -->public MyClass(int 1, int 2) -->public MyClass(int 2, int 3) -->最后public MyClass()
不知道对不对……

作者: 古古头    时间: 2012-7-9 10:21
当你调用MyClass()这个构造方法的时候,等价于先执行MyClass(int,int)再执行MyClass()自身的内容,
一样的道理,你调用MyClass(int,int)就相当于先执行BaseClass(int)再执行MyClass(int,int)自身的内容。
而如果你后面不加:xxx的话,像
        public MyClass(int i)
        {
        }
这样,它实际相当于
        public MyClass(int i):BaseClass()
        {
        }
也就是说,除了Object的构造方法外,所有的构造方法的执行都需要先执行父类的一个构造方法或本类的其它重载构造方法。
作者: 小高    时间: 2012-7-9 10:26
实例化对象  myObjec   调用MyClass  类有参构造方法  
public MyClass(int i, int j) : base(i)   其中base(i)  表示调用父类
BaseClass  带一个参数的构造方法
BaseClass(int i)
你在各个类的构造方法里面输出一条打印语句看结果就知道了   在java中一般都是先创建父类对象在创建子类对象。。   不过你的才C#代码,自己捣腾一下就知道了。
作者: 钱灿    时间: 2012-7-9 10:29
古古头 发表于 2012-7-9 10:21
当你调用MyClass()这个构造方法的时候,等价于先执行MyClass(int,int)再执行MyClass()自身的内容,
一样的 ...

一样的道理,你调用MyClass(int,int)就相当于先执行BaseClass(int)再执行MyClass(int,int)自身的内容。
------------------------------------------------------------------------------
那这个呢……没起到啥作用……
public MyClass() : this(2, 3)
{
}
作者: 钱灿    时间: 2012-7-9 10:34
小高 发表于 2012-7-9 10:26
实例化对象  myObjec   调用MyClass  类有参构造方法  
public MyClass(int i, int j) : base(i)   其中bas ...

我测试过了……
下面这个构造为什么没起到啥作用……
public MyClass() : this(2, 3)
{
}
作者: 古古头    时间: 2012-7-9 10:37
钱灿 发表于 2012-7-9 10:29
一样的道理,你调用MyClass(int,int)就相当于先执行BaseClass(int)再执行MyClass(int,int)自身的内容。
- ...

它相当于
public MyClass()
{
MyClass(2,3);
}
他是为了方便调用者,也许你初始化数据的时候大部分都是要调用MyClass(2,3)的
那么MyClass()提供了一个默认的初始化
作者: 钱灿    时间: 2012-7-9 10:40
古古头 发表于 2012-7-9 10:37
它相当于
public MyClass()
{

也就是说这个东东没有被调用过?感觉好奇怪……
public MyClass() : this(2, 3)
        {
        }
作者: 古古头    时间: 2012-7-9 10:46
钱灿 发表于 2012-7-9 10:40
也就是说这个东东没有被调用过?感觉好奇怪……
public MyClass() : this(2, 3)
        {

有啊,你还可以在MyClass()里面写其它代码啊
比如:
public MyClass():this(2,3)
{
Console.Write("这里是无参构造");
}
作者: 钱灿    时间: 2012-7-9 10:48
古古头 发表于 2012-7-9 10:46
有啊,你还可以在MyClass()里面写其它代码啊
比如:
public MyClass():this(2,3)

可是我试过了的……没有效果……





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