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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  记得上课的时候老师说成员变量的作用于是整个类,但为什么对于形参变量名与成员变量名相同的方法,好像没有其作用?)先上代码:(写这个代码是由于不清楚在执行方法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

15 个回复

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

static 是静态存在与方法区 方法二直接用了  方法一重新给 a,b
回复 使用道具 举报
本帖最后由 xiaofushen 于 2016-3-21 22:15 编辑

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

我可能说的有点乱,简单的说,就是刚开始定义的a,b在方法区的静态区,在类Demo05_Varl调用结束前,值一直没变,形参变量属于局部变量.
回复 使用道具 举报
我今天想了一下,可以用类名点调用在方法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.

点评

再说你.a .b是另一个类里的ab又不是我main方法所在类里的ab  发表于 2016-3-22 13:37
这是用类调用,如果不用类就没法调了?  发表于 2016-3-22 13:36
回复 使用道具 举报
你就定义了Demo05_Var一个类,   a,b在此类中,是此类成员变量,主方法也在此类中,是此类成员方法.
回复 使用道具 举报
xiaofushen 发表于 2016-3-21 21:36
首先,楼主你并没有在方法一中对成员变量进行任何操作(重新赋值),我举个例子来回答楼主疑问
class Student { ...

似乎明白点了
回复 使用道具 举报
604840337 发表于 2016-3-21 21:39
答案没问题啊
int sum_0 = getSum(3,4); 对应方法一  
int sum = getSum(); 对应方法二

今天问老师了貌似明白点了
回复 使用道具 举报
xiaofushen 发表于 2016-3-21 21:41
关于内存中的位置,成员变量是在堆内存中,而局部变量是在栈内存中,这是因为成员变量属于对象,对象进堆内存, ...

一说内存就有点感觉了
回复 使用道具 举报
xiaofushen 发表于 2016-3-22 13:07
我今天想了一下,可以用类名点调用在方法1中对成员变量a,b进行操作:
        public static int getSum(int ...

是我给搞糊涂了,问老师了,就是这么表达的,谢谢
回复 使用道具 举报
赵浩霖 发表于 2016-3-22 22:45
是我给搞糊涂了,问老师了,就是这么表达的,谢谢

不客气,有什么问题大家都可以讨论讨论.
回复 使用道具 举报
xiaofushen 发表于 2016-3-22 22:50
不客气,有什么问题大家都可以讨论讨论.

恩恩{:2_36:}{:2_36:}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马