黑马程序员技术交流社区

标题: 看下这个程序运行的结果 [打印本页]

作者: 崔龙飞    时间: 2013-5-4 20:07
标题: 看下这个程序运行的结果
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;
        }
}

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

作者: 淡蓝色    时间: 2013-5-4 20:44
method(t);//如果改成method(new Test());结果又是什么呢?
System.out.println(t.num);//method(new Test());                      这里输出的是调用了这个方法的返回值,而该方法返回值为void ,所以会造成编译错误
可以打印new Test().num     结果为3
两次new出来的不是同一个对象,不会指向同一个内存地址,
new test() 是开辟了一个新的内存地址,但是并没有将该地址存放在Test t的对象中,所以无法实现
作者: 施祖喜    时间: 2013-5-4 21:13
本帖最后由 施祖喜 于 2013-5-4 21:20 编辑

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

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

没有改之前.png

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

改变后.png

作者: 高新星    时间: 2013-5-4 21:25
施祖喜 发表于 2013-5-4 21:13
System.out.println(t.num); 打印的都是 主函数中的 num
  LZ  这样看的懂了吧!

在内存图中的0是指默认值为0马?
可以已经有给定的初始化值,还会有默认初始化值,马??
作者: 施祖喜    时间: 2013-5-4 22:05
高新星 发表于 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 22:11
施祖喜 发表于 2013-5-4 22:05
对象的初始化过程:

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

O!谢谢!!!!!
作者: 吴建昆    时间: 2013-5-4 22:52
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;
        }
}





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