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

class Demo
{
        public static void main(String[] args)
        {
                int x=6;
                show(x);
                System.out.println(x);
        }
        public static void show(int x)
        {
                x=5;
        }
}
==================
class Demo
{
        int x=6;
        public static void main(String[] args)
        {
                Demo d=new Demo();
                d.x=8;
                show(d);
                System.out.println(d.x);
        }
        public static void show(Demo d)
        {
                d.x=5;
        }
}

评分

参与人数 1技术分 +1 收起 理由
czwanglei + 1

查看全部评分

5 个回复

倒序浏览
第一个x=6,因为在main函数中的x和show函数中的x不是一个,分别是位于2个函数的局部变量。
第二个x=5,因为你把x定义在类的{}中; ,在整个的类{}中都只有一个x。
回复 使用道具 举报
第一个是6  ,第二个是5吧  ,这应该是作用域的问题吧,
第一个Demo的x基本类型只是作为main方法的局部变量存在,跑到Show里面是变了,但是在main方法里没变,要么你把它返回出来,接收到,他就变了。
第二个Demo的x作为一个对象的成员变量存在,也称作属性,是可以改变的,而且是直接调用对象的属性给该属性赋值,没办法,对象就把他保存起来了额
不知道了解没
回复 使用道具 举报

class Demo
{
        public static void main(String[] args)
        {
                int x=6;
                show(x);
                System.out.println(x);
        }
        public static void show(int x)
        {
                x=5;
        }
}
输出是6因为show方法没有返回任何值所以输出为6
class Demo
{
        int x=6;
        public static void main(String[] args)
        {
                Demo d=new Demo();//x=6
                                System.out.println(d.x);
                d.x=8;//x=8
                                System.out.println(d.x);
                show(d);//x=5
                System.out.println(d.x);
        }
        public static void show(Demo d)
        {
                d.x=5;
        }
}
输出为5
回复 使用道具 举报
class Demo
{
        public static void main(String[] args)
        {
                int x=6;//s把6赋值给main x。
                show(x);//,把main x=6传进去,调用show方法,把5赋值给show x。方法执行完,x释放。
                System.out.println(x);//这里打印main x=6.  show方法里的x已经释放想打印也打印 不了。
        }
        public static void show(int x)
        {
                x=5;
        }
}
==================
class Demo
{
        int x=6;
        public static void main(String[] args)
        {
                Demo d=new Demo();//实例化对象,同时初始化x=6.
                d.x=8;//把8赋值给d中的x.
                show(d);//调用show方法把5赋值给d中的x。
                System.out.println(d.x);x从6 到8再到5,打印5.  
        }
        public static void show(Demo d)
        {
                d.x=5;
        }
}
以上代表个人观点,仅供参考:D
一起努力
回复 使用道具 举报
本帖最后由 呆呆沙师妹 于 2014-4-11 18:11 编辑

这应该是基础数据类型和实例对象在内存中存储位置不一样导致的。
第一个程序中,x 定义在main方法内部,调用该main方法后,栈内存中开辟了标识符为 x 的地址空间存储它的值,之后调用了show方法,此时传递给show方法的是 x 变量值的拷贝而非 x 的地址,因而show方法又开辟了新的栈内存储 x 的变量值,然后将这块地址对应的值修改为5,因为没有将值返回给 x 的地址,根据栈后进先出的规则,后创建的值为5的内存区域被释放了,栈内存中 x 的值依然是 6 没有改变;

第二个程序中,x 作为对象的实例属性存在,main方法创建了Demo的实例对象,因实例对象实际存储在堆内存中,开辟了标识符为 d 的栈内存空间中存放实例对象的引用地址,即d中存储的值是实例对象的引用地址,调用show方法后,传递给show方法的是d变量值的拷贝即实例对象的地址,它们指向的是堆内存中的同一对象,对其进行修改后,实际是修改的堆内存中的实例对象,show方法调用结束,它开辟的栈内存空间被释放,main方法中栈内存地址存储的值没有变,但是值对应的实例对象却发生了改变。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马