黑马程序员技术交流社区

标题: 关于成员变量static与形参变量的思考 [打印本页]

作者: 赵浩霖    时间: 2016-3-21 20:41
标题: 关于成员变量static与形参变量的思考
  记得上课的时候老师说成员变量的作用于是整个类,但为什么对于形参变量名与成员变量名相同的方法,好像没有其作用?)先上代码:(写这个代码是由于不清楚在执行方法1时,是不是对成员变量a和b做了运算,相验证一下)

                public class Demo05_Var
                {
                             static int a =10;
                             static int b =20;
                      public static void main(String[] args)
               {
                int sum = getSum();
                System.out.println(sum);

                int sum_0 = getSum(3,4);
                System.out.println(sum_0);       
               }

              public static int getSum(int a ,int b) //方法1
              {
                      return a+b;
       
              }
              public static int getSum()        //方法2
             {
                      return a+b;
             }
     }
可打印的结果是 30 ,7;
         一开始还以为在调用方法1时对成员变量进行了修改。为了判定方法1是否对成员变量进行了修改,于是在调用
方法1后,有加了句调用方法2,代码如下:
public class Demo05_Var
{
        static int a =10;
        static int b =20;
        public static void main(String[] args)
        {
                int sum = getSum();
                int sum_0 = getSum(3,4);
                int sum_1 = getSum();

                System.out.println(sum);
                System.out.println(sum_0);
                System.out.println(sum_1);
       
        }

        public static int getSum(int a ,int b)    //方法1
        {
                return a+b;
       
        }


        public static int getSum()  //方法2
        {
                return a+b;
       
        }
}

          输出结果是:30 ,7 ,30
也就是说在执行方法1时没有改变成员变量的值,然后就对成员变量的作用域产生了疑惑;抑或是成员变量a,b跟形参变量a,b的存储方式不同?
如果是,那我能不能再方法1中对成员变量a,b进行操作呢?又该怎样用它们呢?
          明天才会上课,可我很项尽快知道0.0

作者: xiaofushen    时间: 2016-3-21 21:36
首先,楼主你并没有在方法一中对成员变量进行任何操作(重新赋值),我举个例子来回答楼主疑问
class Student {
     int age = 20;
     void speak() {
     int age = 25;
     System.out.println("大家好,我今年" + age + "岁!");
     }
}
如果某个方法中定义的局部变量与类中成员变量同名,方法中访问的是局部变量,而非成员变量,就近原则.也就是说当有另外的程序来调用speak()方法时,输出是25,不是20.
作者: 604840337    时间: 2016-3-21 21:39
答案没问题啊
int sum_0 = getSum(3,4); 对应方法一  
int sum = getSum(); 对应方法二

static 是静态存在与方法区 方法二直接用了  方法一重新给 a,b
作者: xiaofushen    时间: 2016-3-21 21:41
本帖最后由 xiaofushen 于 2016-3-21 22:15 编辑

关于内存中的位置,成员变量是在堆内存中,而局部变量是在栈内存中,这是因为成员变量属于对象,对象进堆内存,而局部变量属于方法,方法进栈内存.它们生命周期也不同:成员变量随着对象的创建而存在,随着对象的消失而消失,而局部变量随着方法的调用而存在,随着方法的调用完毕而消失,
作者: xiaofushen    时间: 2016-3-21 21:44
楼主想要方法一输出不同于成员变量定义的值,可直接在方法一中给a,b重新赋值.
作者: xiaofushen    时间: 2016-3-21 22:52
本帖最后由 xiaofushen 于 2016-3-22 13:12 编辑

我可能说的有点乱,简单的说,就是刚开始定义的a,b在方法区的静态区,在类Demo05_Varl调用结束前,值一直没变,形参变量属于局部变量.
作者: xiaofushen    时间: 2016-3-22 13:07
我今天想了一下,可以用类名点调用在方法1中对成员变量a,b进行操作:
        public static int getSum(int a ,int b)    //方法1
        {
                         Demo05_Var.a = 5;
                         Demo05_Var.b = 6;
                return Demo05_Var.a+Demo05_Var.b;
        }
这样改之后,成员变量就在方法一中被修改了,这是输出是30,11,11.要是return a+b,输出就是30,7,11.
作者: xiaofushen    时间: 2016-3-22 13:57
你就定义了Demo05_Var一个类,   a,b在此类中,是此类成员变量,主方法也在此类中,是此类成员方法.
作者: 赵浩霖    时间: 2016-3-22 22:41
xiaofushen 发表于 2016-3-21 21:36
首先,楼主你并没有在方法一中对成员变量进行任何操作(重新赋值),我举个例子来回答楼主疑问
class Student { ...

似乎明白点了
作者: 赵浩霖    时间: 2016-3-22 22:42
604840337 发表于 2016-3-21 21:39
答案没问题啊
int sum_0 = getSum(3,4); 对应方法一  
int sum = getSum(); 对应方法二

今天问老师了貌似明白点了
作者: 赵浩霖    时间: 2016-3-22 22:43
xiaofushen 发表于 2016-3-21 21:41
关于内存中的位置,成员变量是在堆内存中,而局部变量是在栈内存中,这是因为成员变量属于对象,对象进堆内存, ...

一说内存就有点感觉了
作者: 赵浩霖    时间: 2016-3-22 22:45
xiaofushen 发表于 2016-3-22 13:07
我今天想了一下,可以用类名点调用在方法1中对成员变量a,b进行操作:
        public static int getSum(int ...

是我给搞糊涂了,问老师了,就是这么表达的,谢谢
作者: xiaofushen    时间: 2016-3-22 22:50
赵浩霖 发表于 2016-3-22 22:45
是我给搞糊涂了,问老师了,就是这么表达的,谢谢

不客气,有什么问题大家都可以讨论讨论.
作者: 赵浩霖    时间: 2016-3-22 22:52
xiaofushen 发表于 2016-3-22 22:50
不客气,有什么问题大家都可以讨论讨论.

恩恩{:2_36:}{:2_36:}




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