黑马程序员技术交流社区

标题: 成员变量同名的局部变量,结果是这样? [打印本页]

作者: 我能驾驭住    时间: 2012-6-5 23:39
标题: 成员变量同名的局部变量,结果是这样?
package Lianxi;

public class Lianxi01 {

        /**
         * @param args
         */
        static int x=3;
        public static void main(String[] args) {
                int x=5;
                // TODO Auto-generated method stub
          System.out.println(x);
        }

}
结果:
5
作者: 金鑫    时间: 2012-6-5 23:43
本帖最后由 金鑫 于 2012-6-5 23:56 编辑

public class Temp {
        int x=3;
        public static void main(String[] args) {
                int x=5;
                System.out.println(x);
        }

}
把外部的变量定义为普通变量,结果仍然是5;

class TEMP {
   int i =3;
   
   public static void fangfa(){
    //在方法内定义一个普通变量,该普通变量会覆盖掉方法外部定义的变量 int i =3;
    int i =6;
    System.out.println(i);
   }

public static void main(String[] args) {
         fangfa();
}
}
调用fangfa(),输出的是6,方法内的局部变量会覆盖掉外部的int i =3;

无论你外部定义的 int i = 3是static修饰的成员变量还是普通变量,局部变量都会覆盖掉外部定义的变量。因为程序自上往下运行,与你定义的什么类型的变量无关。
作者: 曹操    时间: 2012-6-5 23:45
成员变量时是在整个类中有效,局部变量只在局部区域有效,如果出现成员变量和局部变量相同时,那么局部已经有这个变量了就不会去外部初始化了,就在局部初始化了。所以结果是5
作者: 朝哥    时间: 2012-6-6 00:04
局部变量只在自己的{}内有效,LZ如果想调用外面的x=3,可以在打印的x前面加上类名,如Lianxi01.x,打印结果是3.
作者: 赵兵锋    时间: 2012-6-6 10:22
哈哈,我理解为就近原则,在近处发现了同名定义的变量,就使用该变量,出了此范围,对于其他句子来说,最近的已定义的变量就是成员变量了。
作者: 王月    时间: 2012-6-6 11:05
首先,要明白程序的执行的顺序,它是从主函数开始,自上而下执行的。

以楼主这个例子来说:
1,局部变量和成员变量最大的区别就在于作用域不同,即作用的范围不同。
     所以,如果局部已经有变量,不管和成员变量同不同名,因为作用范围不同,这里的输出语句只能输出局部变量。在LZ的这个例子中,就是会输出5.
2,如果成员变量是静态的,必须类名调用才能执行到,只有这时不会输出5

说的可能多了点,lz不要想的太复杂,不然就太浪费时间了





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