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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 崔龙飞 中级黑马   /  2013-5-4 20:07  /  2060 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class Test {

        int num = 3;
        public static void main(String[] args) {

                Test t = new Test();
                t.num = 5;
                method(t);//如果改成method(new Test());结果又是什么呢?
                System.out.println(t.num);//method(new Test());
        }
        public static void method(Test t){
                t.num = 6;
        }
}

解释一下为什么结果会不一样。结合内存说明。谢谢。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

6 个回复

正序浏览
public class Test {
        int num = 3;//num  为Test  的成员变量,如果new Test对象 那获得num值为3

        public static void main(String[] args) {

                Test t = new Test();//这里就是new 了一个对象 对象存在堆里 引用存在栈里 
                t.num = 5;//修改堆里对象的num值改为5 此时num值为5
                method(t);//调用method 方法,对传入对象的值进行修改 改为6 此时此为6
                System.out.println(t.num);// 打印
        }

        public static void method(Test t) {
                t.num = 6;
        }
}
//比较下
public class Test {
        int num = 3;

        public static void main(String[] args) {
                method(new Test());// 创建一个Test对象实例 里面成员变量值为3 调用method方法改为了6
                System.out.println(new Test().num);//又创建 了一个对象 里面成员变量值为3 调用method方法改为了6  因为new 了两次所以是两个不同对象,说白了就是你new 了几个Test 就是创建 了几个Test实例,每个实例的成员变量num 初始值都为3
        }

        public static void method(Test t) {
                t.num = 6;
        }
}
回复 使用道具 举报
施祖喜 发表于 2013-5-4 22:05
对象的初始化过程:

Person p = new Person();//到底在内存中做了什么?

O!谢谢!!!!!
回复 使用道具 举报
高新星 发表于 2013-5-4 21:25
在内存图中的0是指默认值为0马?
可以已经有给定的初始化值,还会有默认初始化值,马?? ...

对象的初始化过程:

Person p = new Person();//到底在内存中做了什么?

1,将Person.class文件加载进内存。
2,p定义函数中,那么在栈内存中开辟一个变量空间p。
3,在堆内存中给对象分配空间,并分配内存地址值
4,给对象中的属性进行默认初始化。
5,给对象中的属性进行显示初始化。
6,调用构造代码块对对象进行初始化。(执行类中的构造代码块)
7,调用对应的构造函数进行对象初始化。对象初始化完毕。
8,将对象内存地址赋值给p变量。让p变量指向该对象。


会先有个显示默认在有显示初始化的。。。
回复 使用道具 举报
施祖喜 发表于 2013-5-4 21:13
System.out.println(t.num); 打印的都是 主函数中的 num
  LZ  这样看的懂了吧!

在内存图中的0是指默认值为0马?
可以已经有给定的初始化值,还会有默认初始化值,马??
回复 使用道具 举报
本帖最后由 施祖喜 于 2013-5-4 21:20 编辑

   System.out.println(t.num); 打印的都是 主函数中的 num
  LZ  这样看的懂了吧!

没有改之前.png (21 KB, 下载次数: 0)

没有改之前.png

改变后.png (20.53 KB, 下载次数: 0)

改变后.png

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
method(t);//如果改成method(new Test());结果又是什么呢?
System.out.println(t.num);//method(new Test());                      这里输出的是调用了这个方法的返回值,而该方法返回值为void ,所以会造成编译错误
可以打印new Test().num     结果为3
两次new出来的不是同一个对象,不会指向同一个内存地址,
new test() 是开辟了一个新的内存地址,但是并没有将该地址存放在Test t的对象中,所以无法实现

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

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