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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王红霞 中级黑马   /  2012-7-10 03:54  /  2376 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 王红霞 于 2012-7-10 15:54 编辑

为什么b是与不是全局变量对结果没有影响?当c是全局变量时对结果也没影响?

public class Demo
{
    int a;
    public void print_0()
        {
       a = 1;
       int b = 2;
       char c='n';
       g(b,c);
       System.out.println(a + ", " + b + ", " +c);
    }
    public void g(int b, char c)
        {
           a=5;
          b=8;
           c='v';
    }
    public static void main(String args[])
        {
        Demo d = new Demo();
        d.print_0();
    }
}
5, 2, n

======================================================================


public class Demo2
{
    int a;
    int b;
    public void print_1() {
       a = 1;
       b = 2;
       char c='n';
       g(b, c);
       System.out.println(a + ", " + b + ", " + c);
    }
    public void g(int b, char c) {
       a = 5;
       b = 8;
       c='v';
    }
    public static void main(String args[]) {
       Demo2 d = new Demo2();
       d.print_1();
    }
}
5, 2, n

评分

参与人数 1技术分 +1 收起 理由
蒋映辉 + 1

查看全部评分

5 个回复

倒序浏览
本帖最后由 贾存双 于 2012-7-10 07:20 编辑

这不是全局变量和不是全局变量的问题,而是引用传递问题,在赋值时把b和c指向了新开辟的单元(栈内存指向堆内存),方法调用完以后,断开了与新单元的指向,所以值没有被保留下来,我是这么理解的,不知道对不对?
你可以试下下面两段代码:
================================
public class Demo {
    int a;
    int b;
    public void print_4() {
        a = 3;
        b = 4;
        g(a, b);
        System.out.println(a + ", " + b );
    }
    public void g(int c, int d) {
      c=5 ;
      d =6 ;
    }
    public static void main(String args[]) {
        Demo d = new Demo();
        d.print_4();
    }
}
这个运行结果是a=3 , b=4 。
==================================
public class Demo3 {
    int a;
    int b;
    public void print_4() {
        a = 3;
        b = 4;
        g(a, b);
        System.out.println(a + ", " + b );
    }
    public void g(int c, int d) {
      c = 5 ;
      d = 6 ;
      a = c ;
      b = d ;
    }
    public static void main(String args[]) {
        Demo3 d = new Demo3();
        d.print_4();
    }
}
这个运行结果是a=5 , b=6 。
回复 使用道具 举报
a值,是直接改变其值;b,不管是全局变量还是局部变量,你函数中改变的b变量,是函数的局部变量。所以Demo2中
public void g(int b, char c) {
       a = 5;
       b = 8;
       c='v';
    }
改为public void g(int b, char c) {
       a = 5;
       this.b = 8;
       c='v';
    }
就会对全局b的值有影响。
回复 使用道具 举报
这个问题设计到两个方面的东西,一:成员变量和局部变脸的区别;二、参数的传递。(首先在此声明,这两个程序的结果只是参数传递造成的)
一、成员变量和局部变量的区别:
从来只有成员变量和局部变量的区别。
我们就好比一个类是一个公司,
成员变量就是这个公司的正式员工,一直存在,与公司同生同灭..
而局部变量就是临时工,公司请临时工来做一点事情,做完,临时工就没有了,被销毁了!
确实有人把成员变量叫成全局变量.那是以这个类作为全部
其实还有一种比成员变量更大的我建一个公用类,我在里面声明一个静态变量,那么,我在任何地方都可以用它

成员变量和局部变量具体区别就是 作用时间和作用范围不同。

二、参数传递:
1.按值传递:
  适用范围:8种基本数据类型、String对象
  特点:在内存中复制一份数据,把复制后的数据传递到方法内部
  作用:在方法内部改变参数的值,外部数据不会跟着发生改变
2.按引用类型传递:
  适用范围:数组、除String以外的其他所有类型的对象
  特点:将对象的地址传递到方法内部
  作用:在方法内部修改对象的内容,外部数据也会跟着发生改变
上述的两个程序就是按值类型传递,程序中传递的是整型数据,int型数据时存放在堆内存中的,随着方法进行传递的时候,相当于在对内存中把自己复制了一下,在方法中改变的是自己的复制体,而自身并没有发生改变。这就是这个问题的原因。

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 姬仁贵 于 2012-7-10 12:59 编辑

public class Demo
{
    int a; //全局变量、整个程序都可以访问
    public void print_0()
        {
       a = 1;//对全局变量a进行赋值操作
       int b = 2; //定义局部变量b并进行赋值、只在当前函数内有效
       char c='n';//定义局部变量c并进行赋值、只在当前函数内有效
       g(b,c);// 将b,c进行值传递。
       System.out.println(a + ", " + b + ", " +c);
       }
    public void g(int x, char y) // 传给g的其实是b,c的拷贝,g改变的是b和c的拷贝的值,并没有改变b,c的值,因为g的参数是按值传递的。
                                                  也就是说在g中,其实创建了两个临时变量,一个为x的值2,另一个是y的值c。

  {
           a=5;//对全局变量进行从新赋值。因为是全局变量所以可以访问。
          x=8;
           y='v';
    }
    public static void main(String args[])
        {
        Demo d = new Demo();
        d.print_0();
    }
}
//所以最后结果是5,2,n
因为怕怕误解所以我将g函数参数列表内的变量名做了更改。
首先要明确的是:定义在函数内部的变量是局部变量,只在函数运行时在内存中开辟空间。局部变量作用域只在当前函数内有效,当函数结束时,局部变量就没有意义了。







评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
姬仁贵 发表于 2012-7-10 12:33
public class Demo
{
    int a; //全局变量、整个程序都可以访问

嗯 谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马