加断点测试以下就可以看出来了! 第一步执行Main里的实例化program类,第二步 转向调用A kk = new A(); 因为是继承的B就会去实例化A类,第三步 调用A的构造方法! 就会打印出a,接着 又去掉用B里的A kk = new A(); 又回去调用 所以打印第二个a,最后调用 program类的bb方法 就打印出b了!
谢谢楼上的~但有2个问题:1.为什么第2步执行的是A kk = new A(); 2.A kk = new A(); 这个赋值语句究竟可以看成是什么,看成构造函数吗?怎么我不明白的是怎么第2步会执行这个赋值语句呢?奇怪。另外这个语句怎么执行2次呢?
1 A kk = new A(); 2 A的构造函数 3 Console.WriteLine( "b ");
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(); 生成的。
楼上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类的构造函数。
大家可能没明白我的意思,我始终认为派生类实例化时要首先要执行基类的静态构造函数,甚至是普通构造函数。例如: 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()语句呢?
第一步执行Main里的实例化program类,第二步 转向调用A kk = new A();
因为是继承的B就会去实例化A类,第三步 调用A的构造方法!
就会打印出a,接着 又去掉用B里的A kk = new A();
又回去调用 所以打印第二个a,最后调用 program类的bb方法 就打印出b了!
2.A kk = new A(); 这个赋值语句究竟可以看成是什么,看成构造函数吗?怎么我不明白的是怎么第2步会执行这个赋值语句呢?奇怪。另外这个语句怎么执行2次呢?
-> 实例化 kk(即A) -> A的构造函数 -> 打印“a”
kkk.bb(); -> 执行bb()-> 打印"b"很简单的啊~
它调用了A的构造函数
2 A的构造函数
3 Console.WriteLine( "b ");
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(); 生成的。
{
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 快来来回答啊
B要先对它的字段kk进行初始化 再开始执行自己的构造函数(因为继承 也就是A的构造函数了)吧
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()语句呢?