zoukankan      html  css  js  c++  java
  • 局部变量与实例变量---一道c#面试题想到的

    上周参加面试,一道c#面试题很简单,面试官三问两问就蒙圈了,回来自己验证一下,才搞明白,汗~总结下:

    ①如下程序输出:

     1 class Program
     2     {
     3         static void Main(string[] args)
     4         {
     5             int t;
     6             string str;
     7             Console.WriteLine("t={0},str={1}",t,str); //问:输出什么?
     8 
     9             Console.Read();
    10         }
    11     }

    ②如下程序输出:

     1 class Program
     2     {
     3         static void Main(string[] args)
     4         {
     5             B b=new B();
     6             b.Test();
     7             Console.Read();
     8         }
     9     }
    10 
    11     public class A
    12     {
    13         public A()
    14         {
    15             Test();
    16         }
    17         public virtual void Test() { }
    18     }
    19 
    20     public class B : A
    21     {
    22         int x;
    23         int y;
    24         string s;
    25 
    26         public B()
    27         {
    28             x = 1;
    29         }
    30         public override void Test()
    31         {
    32             Console.WriteLine("x={0},y={1},s={2}", x, y, s);
    33         }
    34     }

    答案:1题程序直接报错:使用了未赋值的局部变量

           2题: x=0,y=0,s=  

                  x=1,y=0,s=

    2题还涉及实例化子类实例时调用父类构造器的问题,重点比较下1、2中涉及到的两种变量:

    1中声明的变量为局部变量(方法中声明),不会自动初始化,直接调用会报错:使用了未赋值的局部变量

    2中声明的变量为实例变量(类中声明),会自动初始化,int默认0,string默认空字符串。

    延伸:修改B类为如下代码:

     1 public class B : A
     2     {
     3         public int x;
     4         int y;
     5         string s;
     6 
     7         public B()
     8         {
     9             x = 1;
    10         }
    11         public override void Test()
    12         {
    13             int t1;
    14             int t2 = 2;
    15             string str2 = "hello";
    16             Console.WriteLine("x={0},y={1},s={2}", x, y, s);
    17         }
    18     }

    编译,通过.net reflector反编译查看该类,为如下代码:

    得到如下结论:

    1>缺省访问限制符的实例变量,其访问限制为private,即只能类中访问

    2>实例变量的引用,类中可以用this(当前对象)引用,声明为public的变量,类外可以用 实例.实例变量的格式 (如:new B().x )

    3>局部变量,如B中的t1,t2,str2,如果没有被引用,是不会被编译进dll的,因为反编译后未发现它们的影子

    后记:这次面试让我感慨,基础知识很重要,有时候不必懂得多么高深的技术,基础扎实了,也能也出不错的程序

  • 相关阅读:
    super.getClass().getName()方法调用的返回
    外观模式(Façade Pattern)
    Framework 4.0 将何去何从
    SQL Server 2005 第一篇 引言
    抽象工厂模式(Abstract Factory)
    浅谈分页技术
    垃圾邮件
    读书时的软件开发梦
    写技术博客的一个原因应该是寂寞吧
    当下10大最热门的网站开发技术
  • 原文地址:https://www.cnblogs.com/baweier2013/p/5412962.html
Copyright © 2011-2022 走看看