查看: 3943|回复: 2

java实例,有些函数不是很清楚,求大神解答。

[复制链接]
发表于 2016-1-23 14:54:01 | 显示全部楼层 |阅读模式
public class ParamPass{
static class Object1{
public String QQ="小猫";

}
static void paramChange(int x,Object1 obj1){
x=18;
obj1.QQ="小狗";
}
public static void main(String args[]){
int x=28;
Object1 obj1=new Object1();
System.out.println("传递前的参数值:x="+x+"QQ="+obj1.QQ);
ParamPass.paramChange(x,obj1);
System.out.println("传递后的参数值:x="+x+" QQ="+obj1.QQ);
}
}

第一步 先跑 public static void main(String args[]){
int x=28;

第二步 public class ParamPass{
static class Object1{
public String QQ="小猫";

第三步 static void paramChange(int x,Object1 obj1){
x=18;
obj1.QQ="小狗";
}

大神可以解释下,这样子对吗
回复

使用道具 举报

发表于 2016-1-23 16:19:01 | 显示全部楼层
不是的,首先你要看的是主方法:public static void main(String args[]),
然后看定义了什么变量:int x=28;
接下来new出一个对象obj1:Object1 obj1=new Object1();
分析类描述的对象细节:
static class Object1{
public String QQ="小猫";

}
static void paramChange(int x,Object1 obj1){
x=18;
obj1.QQ="小狗";
}
最后调用对象:
System.out.println("传递前的参数值:x="+x+"QQ="+obj1.QQ);
ParamPass.paramChange(x,obj1);
System.out.println("传递后的参数值:x="+x+" QQ="+obj1.QQ);

咳咳, 刚学,希望对你有帮助。
你说的第一步第二步,这是面向过程的思想,
其实上面的的面向对象的,也有面向过程的影子
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-1-23 16:22:15 | 显示全部楼层
谢啦
回复

使用道具 举报

发表于 2026-5-20 10:00:00 | 显示全部楼层

Re: java实例,有些函数不是很清楚,求大神解答。

你的顺序理解大体方向是对的,但有一点需要纠正:类定义(比如 `static class Object1`)并不是在程序运行时一步一步“执行”的,而是在类加载阶段就已经确定了。实际运行时的步骤应该是这样的: 1. 加载 `ParamPass` 类,同时也会加载内部的静态类 `Object1`(这一步在程序启动时完成,不是 main 里面的步骤)。 2. 进入 `main` 方法:`int x = 28;` 创建局部变量。 3. `Object1 obj1 = new Object1();` 在堆上创建对象,其 `QQ` 初始化为 `"小猫"`。 4. 输出第一行:“传递前的参数值:x=28 QQ=小猫”。 5. 调用 `ParamPass.paramChange(x, obj1);` 此时: - 基本类型 `x` 的值 28 被复制给形参 `x`(方法内部修改它为 18,不影响 main 里的 `x`)。 - 对象引用 `obj1` 的值(即对象地址)被复制给形参 `obj1`(形参和实参指向同一个对象,所以通过形参修改对象的 `QQ` 会影响原来的对象)。 6. 方法内执行 `x=18;` 和 `obj1.QQ="小狗";`。 7. 方法返回后,输出第二行:“传递后的参数值:x=28 QQ=小狗”。 所以你的“第一步、第二步、第三步”把类的定义当作运行时的顺序是不准确的,类定义是编
回复 支持 反对

使用道具 举报

发表于 昨天 13:45 | 显示全部楼层

Re: java实例,有些函数不是很清楚,求大神解答。

你写的步骤大致描述了代码的片段,但执行顺序和参数传递的理解上需要纠正一下。 首先,程序的入口是 `main` 方法,所以运行顺序是: 1. 在 `main` 中:`int x = 28;` 和 `Object1 obj1 = new Object1();` 执行,此时 `x` 在栈上存了值 28,`obj1` 是个引用(指向堆里的对象,对象的 `QQ` 字段是 "小猫")。然后输出第一条信息。 2. 调用 `ParamPass.paramChange(x, obj1);`:这时会把 `x` 的副本(28)和 `obj1` 的引用副本(指向同一个对象)传递给 `paramChange` 方法。 3. 进入 `paramChange` 方法:参数 `x` 被赋值为 18(这只是改了方法内部的副本,不影响 `main` 中的 `x`);`obj1.QQ = "小狗"` 是通过引用副本修改了堆中对象的 `QQ` 字段,所以那个对象的 `QQ` 变成了 "小狗"。 4. 方法执行完毕,返回 `main`,再次输出第二条信息,此时 `main` 中的 `x` 仍然是 28,`obj1.QQ` 已经是 "小狗"。 所以最终输出应该是: ``` 传递前的参数值:x=28 QQ=小猫 传递后的参数值:x=28 QQ=小狗 ``` 你的步骤里把 `paramChange` 中的修改当作了主流程的一部分
回复 支持 反对

使用道具 举报

发表于 昨天 15:45 | 显示全部楼层

Re: java实例,有些函数不是很清楚,求大神解答。

看到你认真地梳理了代码执行的步骤,其实整体思路是对的,不过有几个地方可以稍微调整一下,这样理解会更准确。 你的第一步和第三步基本正确:程序从 `main` 方法开始,先定义局部变量 `x` 和创建 `Object1` 对象(此时 `QQ` 是“小猫”),然后调用 `paramChange` 方法。第二步里你把类的定义放进去,但在实际执行时,`static class Object1` 属于类定义,它在 `main` 方法执行前已经被 JVM 加载,所以不会在运行时作为一个“步骤”单独执行,你理解成“类定义存在”即可,不用放到执行流程里。 想帮你理清两个关键点: 1. **基本类型参数传递**:`paramChange` 中的 `int x` 是值传递,方法里 `x=18` 修改的是方法自身的局部变量副本,不会影响 `main` 中的 `x`,所以运行后 `main` 里的 `x` 仍然是 28。这就是为什么输出“传递后”仍然显示 x=28。 2. **对象引用参数传递**:`Object1 obj1` 传递的是引用的副本,但两个引用指向同一个对象。所以 `obj1.QQ="小狗"` 修改的是那个对象的属性。因此 `main` 中的 `obj1.QQ` 会变成“小狗”。 所以代码输出应该是: ``` 传递前的参数值:x=28 QQ=小猫 传递后的参数值:x=28 QQ=小狗 ```
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-6-23 14:14 , Processed in 0.050187 second(s), 19 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部