关于java里static method的一个小问题

来源:百度知道 编辑:UC知道 时间:2024/05/16 23:41:45
static int f(int x){x=2*x;return x;}
然后主程序int x=2,引用一次f(x),得到4,但是主程序里的x还是等于2

但是对于这样一个程序
class monint{int val;}
class Test{
static int f(monint z){
z.val =2*z.val;
return z.val;}
public static void mains(string[] args){
monint x=new monint;
x.val=1;
system.out.print(f(x)+" "+x)
}
}

为什么这里x.val就变成2了呢?
难道因为x的类型是monint,非基础类型么?

再举个关于list例子,
static int long(list xs){
int r=0;
for(;xs!=null;x=x.next)r++;
return r}//返回list xs的长度
然后主程序里面
list xs=new list(1,newlist(2,newlist(3,null)));
int size=long(xs);
这里引用函数long以后,返回长度3
但是在size里面有个循环语句for,使x=x.next,引用过long函数以后,主程序里面的xs最后变了么,为什么啊

请求大人解惑
主要是比较第二个和第三个函数,低一个f(x)=4,x=2的我明白。

如果说第二个例子里面的monint不是基础类,所以用函数的时候,就调用了x的引用地址(reference),进而改变了该地址下的分量val值。
但是如果这样解释的话,第三个例子里面,如果也是调用list x的reference,那么函数里面有个循环for语句,在for里面,已经逐步将x改成了x.next。引用完了list以后,x究竟是变成了null,还是仍然是1-2-3-null?

1:f()函数中的x跟主函数的x不是同一个东西。你调用f(x)只是把主函数x的值传了进去。f()函数的x值被修改了。但是他并没有修改主函数中x的值。如果你想修改主函数x的值。加x = f(x);这句就可以了。
2:是的。对象传参跟基本数据类型是不一样的。对象传进去的是对象的引用。对象的引用其实就是参数本身。所以修改了参数对象的值。其实就修改了对象的值。
3:不会吧。除非你对xl进行添加,删除操作。要不是不会变的。只有通过添加,删除操作才会改变他的大小。
你是所用的long函数其实就是取得xl的大小。又没改变它的大小。所以就不变了。

list x 它的值是不变的。因为没有修改它里面的元素。它的值肯定不变的。
x.next只是遍历它里面的元素而已。并没有修改。所以是不会变的。

晕了,你眼花了。前一个函数形参也叫x!!!
这个形参x属于局部变量,如果局部变量和类成员变量同名时,类成员变量会被隐藏,需要借助this.变量名的形式访问对象级类成员;借助类名.变量名访问类级类成员。
===============================
第二个你修改的是x的成员val。引用传递实际上是用局部引用型变量也指向你传递来的那个对象了,所以,这个局部引用型变量修改成员对外部是有效的。
第三个你用局部引用型变量x指向了传递来的对象,然后却将它另赋值,对象赋值表示的是要将此对象指向另一对象。并不是修改其内容。所以,真正的对象在这里没变。
要搞明白引用赋值和值赋值之间的差别。

楼主没有搞清楚全局变量和局部变量啊,只说上面的
static int f(int x){x=2*x;return x;}然后主程序int x=2,引用一次f(x),得到4,但是主程序里的x还是等于2,因为
参数x只在f这个方法中有效,x扩大2倍后再等于x相对于修改了参数x
(和int x=2中的x一点关系都没有),出了这个方法x就没用了,x的作用域就是在f方法中。(局部变量)
关于x.val是外部对象引用的属性,作用域在类与类之间。(全局变量)
一个变量在方法外声明是全局变量,在方法内声明是局部变量。