例如程序:
using System;
class A
{
public A()
{
Console.WriteLine("A 构造函数");
}
public void Greet()
{
Console.WriteLine("A 问候");
}
public void Talk()
{
Console.WriteLine("A 说话");
}
public virtual void Sing()
{
Console.WriteLine(" 唱歌");
}
}
class B:A
{
public B()
{
Console.WriteLine("B 构造函数");
}
public void Talk()
{
Console.WriteLine("B 说话");
}
public override void Sing()
{
Console.WriteLine("B 唱歌");
}
}
public class Test
{
public static void Main()
{
A a1 = new B(); //困惑1
a1.Talk();
a1.Sing(); //困惑2
a1.Greet();
B a2 = new B(); //困惑3
a2.Talk();
a2.Greet();
a2.Sing();
}
}
的输出结果是:
A 构造函数
B 构造函数
A 说话
B 唱歌
A 问候
A 构造函数
B 构造函数
B 说话
A 问候
B 唱歌
*******************************************
困惑1:首先,A a1 = new B();什么意思?
其次,为什么运行到这句的时候,同时输出了“A 构造函数B 构造函数”?也就是说,为什么运行到这句的时候,同时调用了构造函数A和B?
再次,能否写成B a1 = new B();或者A a1 = new A();?
困惑2:a1.Sing();这句之所以输出“B 唱歌”,是否因为a1是属于B类, 所以调用B类中重写后的Sing()方法?
困惑3:按照程序的运行结果来看,运行B a2 = new B();这句时,也输出了“A 构造函数B 构造函数”。这和A a1 = new B();这句输出的结果相同。请问又这是为什么?
要是有好心人,能附个程序的运行流程就好了。谢谢
繁华开满天机
相关分类