问题描述
publicclassA{publicA(){Console.WriteLine("a");}}publicabstractclassB:A{publicvoidbb(){Console.WriteLine("b");}Akk=newA();}publicclassProgram:B{staticvoidMain(){Programkkk=newProgram();kkk.bb();}}上面代码结果为什么是aab呢?另外我记得老师好像说类成员可以有字段、方法、属性和事件,那么Akk=newA()属于上面什么成员呢?谢谢大家了。我是初学者。
解决方案
解决方案二:
这是我在csdn的第一个贴,请大家帮忙啊,谢谢大家了,在线等中。。。。。。
解决方案三:
加断点测试以下就可以看出来了!第一步执行Main里的实例化program类,第二步转向调用Akk=newA();因为是继承的B就会去实例化A类,第三步调用A的构造方法!就会打印出a,接着又去掉用B里的Akk=newA();又回去调用所以打印第二个a,最后调用program类的bb方法就打印出b了!
解决方案四:
谢谢楼上的~但有2个问题:1.为什么第2步执行的是Akk=newA();2.Akk=newA();这个赋值语句究竟可以看成是什么,看成构造函数吗?怎么我不明白的是怎么第2步会执行这个赋值语句呢?奇怪。另外这个语句怎么执行2次呢?
解决方案五:
实例化program->实例化B->实例化A(B继承A)->A的构造函数->打印“a”->实例化kk(即A)->A的构造函数->打印“a”kkk.bb();->执行bb()->打印"b"很简单的啊~
解决方案六:
因为类B实例化的时候对它的字段kk有个初始化的过程也可以算是默认构造函数的一部分吧它调用了A的构造函数
解决方案七:
1Akk=newA();2A的构造函数3Console.WriteLine("b");
解决方案八:
1.newProgram()的时候要去实例化Program,执行构造函数,但是它是继承自B的,因此编译器就去加载B类,首先执行的是字段的初始化,因此在Akk=newA();中,实例化了A,调用了A的构造函数,输出了"a"2.执行完Akk=newA()后,因为B类还没有加载完,接着找它的构造函数,发现它是继承自类A的,因此又加载类A,找到类A的构造函数,因此输出了第二个"a"3.类A也加载完成后,调用kkk.bb(),因继承自类B,因此相当于调用B.bb(),输出了"b"楼主说“Akk=newA();执行了两次”是错误的,只执行了一次。第一个"a"是它输出的。第二个"a"可以说是Programkkk=newProgram();生成的。
解决方案九:
楼上DeViLIvy谢谢你,但您的第一条写的“编译器就去加载B类,首先执行Akk=newA()”,我总是不明白为什么执行这个语句,因为赋值号右边有newa()语句的关系吗?按照我的理解编译器去加载B类时,看到继承自A类,首先执行的是A类的构造函数啊,例如:publicclassA{publicA(){Console.WriteLine("a");}}publicclassB:A{publicB(){Console.WriteLine("b");}}publicclassC{staticvoidMain(){Bkk=newB();}}结果为ab编译器加载B类时,看到继承自A类,先加载A类的构造函数。
解决方案十:
自从开始学C#,发现许多许多的问题,还请各位大侠帮忙,真心谢谢大家了。问的可能大家不屑一顾,但真心求求大家帮忙解答^-^。在线等中。。。。。。DeViLIvy快来来回答啊。。。
解决方案十一:
谁说一下为什么先执行执行Akk=newA()”,再执行A类的构造函数啊?
解决方案十二:
B要先对它的字段kk进行初始化再开始执行自己的构造函数(因为继承也就是A的构造函数了)吧
解决方案十三:
大家可能没明白我的意思,我始终认为派生类实例化时要首先要执行基类的静态构造函数,甚至是普通构造函数。例如:publicclassA{staticA(){Console.WriteLine("a");}}publicclassB:A{staticvoidMain(){Bkkk=newB();}}例子运行结果为a。但是,下面这个例子:publicclassA{staticA(){Console.WriteLine("a");}}publicclassB:A{Bkk=newB();staticvoidMain(){Bkkk=newB();}}例子运行结果:不是先输出a再执行死循环,而是直接死循环。那么为什么这个例子不是先执行静态构造函数,而是直接执行了Bkk=newB()语句呢?
解决方案十四:
好象一道面试题。接分
解决方案十五:
Mark