class Point
    {
        protected int x, y;
        public Point()
        {
            this.x = 0;
            this.y = 0;
            Console.WriteLine("Point Constructor:" + this.ToString());
        }        public Point(int a, int b)
        {
            this.x = a;
            this.y = b;
            Console.WriteLine("Point Constructor:" + this.ToString());
        }        public override string ToString()
        {
            return "[" + this.x.ToString() + "," + this.y.ToString() + "]";
        }
    }    class Circle : Point
    {
        protected double radius;        public Circle() : base(4,5)
        {
            this.radius = 10D;
            Console.WriteLine("Circle Constructor:" + this.ToString());
        }        public override string ToString()
        {
            return "Center=" + base.ToString() + ";Radius=" + this.radius.ToString();
        }
    }    class Class1
{

static void Main(string[] args)
{
            Circle c = new Circle();
            Console.ReadLine();
}
}
请大家给讲解一下, 输出解果, 主要是为什么会是这个结果?

解决方案 »

  1.   

    结果:
    Point Constructor:Center=[4,5];Radius=0
    Circle Constructor:Center=[4,5];Radius=10首先,我们了解一下创建Circle类型实例的过程。Circle是Point的子类。所以在调用Circle的构造函数之前,需要调用其父类Point的构造函数。然而Point拥有两个构造函数,一个是没有参数的,一个是有参数的。这里,你调用的是有参数的父类的构造函数。接着,看看这个有参数的父类构造函数,里面调用了this.ToString()我们知道这个this是指向Circle实例的。this.ToString()是Circle里重载的ToString()方法,而不是父类的。在Circle里的ToString()方法又调用了父类的ToString()方法。而这时候,通过父类的构造函数已经对x,y进行了初始化,但radius还没有被初始化。CLR会为类型所有
    值类型初始化为0,而引用类型初始化为null。
    因此,第一次打出了:
    Point Constructor:Center=[4,5];Radius=0
    最后,进入了Circle自己的构造函数,再一次调用自己的ToString()方法。这时候radius已经被初始化,因此,第二次打出了:
    Circle Constructor:Center=[4,5];Radius=10其过程调用如下:
           Type       Method
    ------------------------------
           Point      Point(int,int)
           Circle     ToString()
           Point      ToString()
           Circle     Circle()
           Circle     ToString()
           Point      ToString()
      

  2.   

    CLR会为类型所有值类型初始化为0,而引用类型初始化为null。写清楚些:CLR会为所有类型的数据成员进行初始化,值类型=0, 引用类型=null
      

  3.   

    运行结果是:
    Point Constructor:Center=[4,5];Radius=0
    Circle Constructor:Center=[4,5];Radius=10运行过程如下:
    执行到Circle c = new Circle();时,就调用Circle类的构造函数Circle(),而Circle()执行时是先调用基类Point的构造函数,然后再调用自己的构造函数,但是Point类有两个构造函数,这里就要重载了,因为有参数,所以是调用Point(int a, int b)函数,结果就是输出Point Constructor:Center=[4,5];Radius=0,当然这里还有一个重写ToString()方法的问题;接着调用自己的构造函数Circle(),输出Circle Constructor:Center=[4,5];Radius=10.