c#初学者向大家请教一个问题,非常非常简单的问题

ndslpsp 2007-11-02 10:37:58
public class A
{
public A() { Console.WriteLine("a"); }
}
public abstract class B:A
{
public void bb()
{
Console.WriteLine("b");
}
A kk = new A();
}
public class Program:B
{
static void Main()
{
Program kkk = new Program();
kkk.bb();
}
}
上面代码结果为什么是a a b呢?另外我记得老师好像说类成员可以有字段、方法、属性和事件,那么A kk = new A()属于上面什么成员呢?
谢谢大家了。我是初学者。
...全文
217 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
sadever 2007-11-04
  • 打赏
  • 举报
回复
Mark
清风道禅 2007-11-04
  • 打赏
  • 举报
回复
好象一道面试题。接分
ndslpsp 2007-11-03
  • 打赏
  • 举报
回复
谁说一下为什么先执行执行A kk=new A()”,再执行A类的构造函数啊?
ndslpsp 2007-11-03
  • 打赏
  • 举报
回复
自从开始学C#,发现许多许多的问题,还请各位大侠帮忙,真心谢谢大家了。
问的可能大家不屑一顾,但真心求求大家帮忙解答^-^。在线等中。。。。。。DeViLIvy 快来来回答啊。。。
ndslpsp 2007-11-03
  • 打赏
  • 举报
回复
楼上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类的构造函数。
DeViLIvy 2007-11-03
  • 打赏
  • 举报
回复
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(); 生成的。
NewUser2008 2007-11-03
  • 打赏
  • 举报
回复
1 A kk = new A();
2 A的构造函数
3 Console.WriteLine( "b ");
ndslpsp 2007-11-03
  • 打赏
  • 举报
回复
大家可能没明白我的意思,我始终认为派生类实例化时要首先要执行基类的静态构造函数,甚至是普通构造函数。例如:
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()语句呢?
ndslpsp 2007-11-02
  • 打赏
  • 举报
回复
谢谢楼上的~但有2个问题:1.为什么第2步执行的是A kk = new A();
2.A kk = new A(); 这个赋值语句究竟可以看成是什么,看成构造函数吗?怎么我不明白的是怎么第2步会执行这个赋值语句呢?奇怪。另外这个语句怎么执行2次呢?
wdd000 2007-11-02
  • 打赏
  • 举报
回复
加断点测试以下就可以看出来了!
第一步执行Main里的实例化program类,第二步 转向调用A kk = new A();
因为是继承的B就会去实例化A类,第三步 调用A的构造方法!
就会打印出a,接着 又去掉用B里的A kk = new A();
又回去调用 所以打印第二个a,最后调用 program类的bb方法 就打印出b了!
ndslpsp 2007-11-02
  • 打赏
  • 举报
回复
这是我在csdn的第一个贴,请大家帮忙啊,谢谢大家了,在线等中。。。。。。

111,094

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧