这是我在csdn的第一个贴,请大家帮忙啊,谢谢大家了,在线等中

解决方案 »

  1.   

    加断点测试以下就可以看出来了!
    第一步执行Main里的实例化program类,第二步 转向调用A kk = new A();
    因为是继承的B就会去实例化A类,第三步 调用A的构造方法!
    就会打印出a,接着 又去掉用B里的A kk = new A();
    又回去调用 所以打印第二个a,最后调用 program类的bb方法 就打印出b了!
      

  2.   

    谢谢楼上的~但有2个问题:1.为什么第2步执行的是A   kk   =   new   A(); 
                         2.A   kk   =   new   A(); 这个赋值语句究竟可以看成是什么,看成构造函数吗?怎么我不明白的是怎么第2步会执行这个赋值语句呢?奇怪。另外这个语句怎么执行2次呢?
      

  3.   

    实例化program -> 实例化B -> 实例化 A(B继承A)   -> A的构造函数 -> 打印“a”
                               -> 实例化 kk(即A)     -> A的构造函数 -> 打印“a”
    kkk.bb();    -> 执行bb()-> 打印"b"很简单的啊~  
     
      

  4.   

    因为类B实例化的时候对它的字段kk有个初始化的过程 也可以算是默认构造函数的一部分吧
    它调用了A的构造函数
      

  5.   

    1   A   kk   =   new   A(); 
    2   A的构造函数
    3   Console.WriteLine( "b "); 
      

  6.   

    1.new   Program()的时候要去实例化Program,执行构造函数,但是它是继承自B的,因此编译器就去加载B类,首先执行的是字段的初始化,因此在A   kk   =   new   A(); 中,实例化了A,调用了A的构造函数,输出了"a"
    2.执行完A   kk   =   new   A()后,因为B类还没有加载完,接着找它的构造函数,发现它是继承自类A的,因此又加载类A,找到类A的构造函数,因此输出了第二个"a"
    3.类A也加载完成后,调用kkk.bb(),因继承自类B,因此相当于调用B.bb(),输出了"b"楼主说“A   kk   =   new   A();执行了两次”是错误的,只执行了一次。第一个"a"是它输出的。第二个"a"可以说是Program   kkk   =   new   Program(); 生成的。
      

  7.   

    楼上DeViLIvy 谢谢你,但您的第一条写的“编译器就去加载B类,首先执行A kk=new A()”,我总是不明白为什么执行这个语句,因为赋值号右边有new a()语句的关系吗?按照我的理解编译器去加载B类时,看到继承自A类,首先执行的是A类的构造函数啊,例如:public class A
        {
            public A()
            {
                Console.WriteLine("a");
            }
        }
        
        public class B:A
        {
           public B()
           {
               Console.WriteLine("b");
           }
        }
        public class C
        {
            static void Main()
            {
                B kk = new B(); 
            }
        }
    结果为a
         b
    编译器加载B类时,看到继承自A类,先加载A类的构造函数。
      

  8.   

    自从开始学C#,发现许多许多的问题,还请各位大侠帮忙,真心谢谢大家了。
    问的可能大家不屑一顾,但真心求求大家帮忙解答^-^。在线等中DeViLIvy 快来来回答啊
      

  9.   

    谁说一下为什么先执行执行A kk=new A()”,再执行A类的构造函数啊?
      

  10.   


    B要先对它的字段kk进行初始化 再开始执行自己的构造函数(因为继承 也就是A的构造函数了)吧
      

  11.   

    大家可能没明白我的意思,我始终认为派生类实例化时要首先要执行基类的静态构造函数,甚至是普通构造函数。例如:
     public class A
        {
            static A() { Console.WriteLine("a"); }
        }
        public class B : A
        {
            static void Main()
            {
                B kkk = new B();
            }
        }
    例子运行结果为a。
    但是,下面这个例子:
    public class A
        {
            static A() { Console.WriteLine("a"); }
        }
        public class B : A
        {
            
            B kk = new B();
            static void Main()
            {
                B kkk = new B();
            }
        }
    例子运行结果:不是先输出a再执行死循环,而是直接死循环。
    那么为什么这个例子不是先执行静态构造函数,而是直接执行了 B kk = new B()语句呢?