A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 陈辉 中级黑马   /  2012-11-15 15:13  /  1467 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 陈辉 于 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(); 不会再被调用,函数返回,程序结束。


















1 个回复

倒序浏览
值得学习ing!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马