问一个关于java的基础问题

publicclassLianXi{publicintm=0;publicstaticvoidmain(String[]args){intcat1=0;LianXicat... public class LianXi {
public int m=0;

public static void main(String[] args) {
int cat1=0;
LianXi cat2=new LianXi();
LianXi cat3=new LianXi();
int[] cat4={0};

x2(cat1,cat2,cat3,cat4);

System.out.println(cat1);
System.out.println(cat2.m);
System.out.println(cat3.m);
System.out.println(cat4[0]);
}

public static void x2(int cat1,LianXi cat2,LianXi cat3,int[] cat4){
cat1=1;
cat2.m=1;
cat3=new LianXi();
cat3.m=1;
cat4[0]=1;
}
}

为什么输出答案是0 1 0 1,谁可以给我分析下,我是新手,我觉得cat
1应该输出也是1啊,为什么是0
展开
 我来答
百度网友dab0841
2012-04-27 · TA获得超过609个赞
知道小有建树答主
回答量:193
采纳率:0%
帮助的人:144万
展开全部
Java的参数传递总结:

JAVA的参数传递总是传"值",但是传值方式也分为两种方式,它们是靠传递参数的类型区分的。这两种类型分别为JAVA的基础类型和Object(对象)类型;基础类型包括boolean,byte,short,char,int,long,float,double,而Object就是对象,如数组.在参数为基础类型时,见代码:
public class A{
public static void main(String arg[]){
int a=3;
method1(a);
System.out.println(a);
}
public static void method1(int a){
a=4;
}
}
此时结果的输出将是1,而且只要你的值在Main函数中没变,a的值不管怎么传都不回变,这是因为a是传值,而这个"值"是a的一个拷贝,a的值在传递后的改变只是改变了a的拷贝的内容,并没有改变真正的a的值;对于参数为对象
public class A{ public class A{
public static void main(String arg[]){ public static void main(String arg[]){
int[] a=new int[1]; int[] a=new int[1];
a[0]=3; a[0]=3;
method1(a); method1(a);
System.out.println(a[0]); System.out.println(a[0]);
} }
public static void method1(int[] a){ public static void method1(int[] a){
a[0]--; a=new int[0];
} a[0]=4;
} }
}
左边的结果将是2,右边的结果将是3(未变),原因是:在传递的参数为对象时,这个传递的"值"中放的内容实际上是对向所在的地址,左边的情况是指针定位到对象的地址后,在上面把内容给改了,所以数组的值后会改变,而右边的情况为给对象新分配了一个指针到新的地址上面去,所以所有的操作都在新的地址上面,并不会影响原来的值。注:对于String,Interger,Boolean,Double等的系统对象,它们虽然是Object,但是任何方式的传递参数的值得改变并不会影响原来的值。
更多追问追答
追问
你第一段代码应该输出3吧?因为你本来就 int a=3; 啊 则么会输出1?
追答
嗯,多谢哈,写错了,应该是3的,呵呵
yinruisi4
2012-04-27 · TA获得超过594个赞
知道小有建树答主
回答量:277
采纳率:100%
帮助的人:237万
展开全部
x2方法中的cat1的值是修改了,但是作用范围仅仅在这个方法内,它传的是值,无论怎么传他改变的无非是他的拷贝内容,他真正的值并没有发生变化。而cat2的值有变化是因为,传进方法的是一个引用的副本,这个引用的副本直接指向了内存中的地址,所以cat2指向的地址中的属性变为1,出了这个方法,cat2的引用存在,指向的位置并没有发生改变,而这个地址里的属性已经变为1了。cat4也是一样的道理。你可以给类添加一个有参数的构造方法,主函数中给cat3赋值为2,然后把cat3传进方法内,在方法内部给cat3新new一个对象,你会发现cat3输出的结果仍然是2.这就说明了传入方法的只是一个引用的副本,你在方法内new一个,方法内的cat3引用的副本指向其他的地址了,但是main方法中cat3指向的位置并没有发生变化,所以它的值仍然是2.
String有点特殊。因为String不可变,所以将String对象传入某个方法内做变化的话,出了这个方法后,String仍然是原来的值。String做所谓的拼接操作的时候实质上是新创建了一个字符串,而原来的字符串仍然存在。如String s = “abc”;s+="def";这样的操作后s = “abcdef”,但是这个字符串是新建的,而不是在abc的基础上添加的,s由原来指向abc现在指向了abcdef而已。而在传参数的方法中,传递的仍然是引用的副本,也就是s的副本,在方法内部,s的副本指向了其他的地方,出了这个方法,s仍然指向的是原来的地方,而那个地方的值不可能做出变化。
更多追问追答
追问
public class LianXi {
public int m=0;

public static void main(String[] args) {
int cat1=0;
LianXi cat2=new LianXi();
LianXi cat3=new LianXi();
cat3.m=3;
int[] cat4={0};

c3(cat3);

}

public static void c3(LianXi cat3){
cat3=new LianXi();
System.out.println(cat3);
}
}

你是说这样写?怎么输出是LianXi@1e5e2c3? 好奇怪啊 我完全不会 你可以把代码给我写下来吗
追答
不是,我写给你。
public class LianXi {
public int m=0;
public LianXi(){}
public LianXi(int a){
this.m=a;
}
public static void main(String[] args) {
int cat1=0;
LianXi cat2=new LianXi();
LianXi cat3=new LianXi(2);
int[] cat4={0};

x2(cat1,cat2,cat3,cat4);

System.out.println(cat1);
System.out.println(cat2.m);
System.out.println(cat3.m);
System.out.println(cat4[0]);
}

public static void x2(int cat1,LianXi cat2,LianXi cat3,int[] cat4){
cat1=1;
cat2.m=1;
cat3=new LianXi();
cat4[0]=1;
}
}
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
yandajun01
2012-04-27 · 超过11用户采纳过TA的回答
知道答主
回答量:42
采纳率:0%
帮助的人:29.8万
展开全部
说一下我的理解:
1、函数所有参数都是其局部变量,对其内容的修改不会影响别人。
2、基础变量(int float char double等)以外的参数,传递的都是对象,即对象的引用,学过C的话,可以看做是指针。
3、在函数内对其参数的修改,只是修改了其局部变量地址上的值。
对你的这个问题分析一下:
参数刚传进来时
局部变量地址一:int cat1 值:0
局部变量地址二:LianXi cat2 值:cat2对象的指针
局部变量地址三:LianXi cat3 值:cat3对象的指针
局部变量地址三:int[] cat4 值:int数组对象的指针(JAVA中除了基础变量之外,其余都是对象)
函数的语句执行过程中,只能修改自己的局部变量,执行结束后
局部变量地址一的值:0
局部变量地址二的值:cat2对象的指针,对象的内容被修改,但地址里的内容没有修改
局部变量地址三的值:new LianXi() 对象的指针,并且指针所引用的对象内容被修改
局部变量地址三的值:int[] cat4 对象的指针,对象的内容被修改,但地址里的内容没有修改
函数执行完后,回到main里
cat1和函数没有关系,没有被修改。
cat2引用的对象在函数中被修改成了1
cat3引用的对象没有被修改过
cat4引用的对象在函数中被修改成了1
所以输出是 0,1,0,1
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
darkads2012
2012-04-27 · TA获得超过577个赞
知道小有建树答主
回答量:295
采纳率:0%
帮助的人:314万
展开全部
cat1是main函数中的局部变量,不会被函数X2修改
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
Mr丶Xq
2012-04-27 · 超过16用户采纳过TA的回答
知道答主
回答量:38
采纳率:0%
帮助的人:41.7万
展开全部
多做做引用传递和值传递的练习就会了。。我以前也蒙。。 现在就好了~~
更多追问追答
追问
是否可以这么理解 :
boolean,byte,short,char,int,long,float,double这八种在main
方法里,不管外面怎么传参,也不会改变他的值,其他的引用的,外面就能改变他的值?
追答
那个是类型转换的问题拉。跟值传递是木有关系的。 一般情况自动类型转换的话 遵循由低位向高位装换。 强制转换的话,则转换成被强转的值类型。 数值是会改变的~

还有传参的话 数据类型不一样 是没法传递的 。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式