黑马程序员技术交流社区

标题: 一段很好玩的程序代码 [打印本页]

作者: 陈辉    时间: 2012-11-15 15:13
标题: 一段很好玩的程序代码
本帖最后由 陈辉 于 2012-11-15 20:35 编辑

1、代码如下:
namespace 验证PreRenderRecursiveInternal
{
    class Program
    {
        static void Main(string[] args)
        {
            B b = new B();
            b.s = "ssss";
            b.SayHello();
            Console.ReadKey();
        }
    }

    public class B
    {
        public string s;
        public void SayHello()
        {
            Console.WriteLine("Hello");
            if (s != null)
            {
                SayHello();
            }
        }
    }

    public class D : B
    {
    }
}
2、结果: a、上述程序输出的结果是:不断的输出“Hello”,直到栈溢出为止,因为创建B对象后就初始化变量s。当第一次调用SayHello 时,s不为null,当在SayHello 中在调用
                       SayHello ,而此时s还是不为null,就这样形成了递归调用,但函数却不返回,一致会向栈中压入当前调用的地址, 直到栈溢出为止 。
                 b、将 SayHello(); 换成new D().SayHello();时,就输出两个Hello,因为创建B对象后就初始化变量s。当第一次调用 SayHello 时,s不为null ,所以输出Hello;当在
                       SayHello中执行 new D().SayHello(); 时,输出Hello ,由于创建D对象,而D继承于B,所以又创建了B对象,而此时B对象的s变量未初始化,所以为null,因此
                       new D().SayHello(); 不会再被调用,函数返回,程序结束。



















作者: 许庭洲    时间: 2012-11-15 21:40
值得学习ing!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2