会c++和java的来看我的问题

来源:百度知道 编辑:UC知道 时间:2024/07/03 12:02:40
// Simple types are passed by value.
class Test {
void meth(int i,int j) {
i *= 2;
j /= 2;
}
}
class CallByValue {
public static void main(String args[]) {
Test ob = new Test();
int a = 15,b = 20;
System.out.println("a and b before call: " +
a + " " + b);
ob.meth(a,b);
System.out.println("a and b after call: " +
a + " " + b);
}
}
----参考《java2参考大全》

我想问一下,大家对这个现实的结果是什么,最后的“ob.meth(a,b);”这句话的栈空间是在后面的println显示之后才结束的,还是再分好的时候就该结束了?
这个涉及到临时栈空间,我现在有点搞混了,自己想的觉着有错误。希望大家来给我纠正~!
看你的回答感觉你是学c++的,在java里没有指针,形参按值传递是一定的,我想知道的是,关于调用方法(c++里称成员函数)后栈的处理。为什么没有经过赋值表达式,而外界的变量会改变?

我想明确一下你的问题,你想知道的是:调用meth方法以后,meth内部的临时变量(存在于栈上)何时被消除?
那么明确告诉你,在那个ob.meth(a,b);的分号以后就被消除了。

但是你接下来的问题有些混乱让人不明所以:“为什么没有经过赋值表达式,而外界的变量会改变?”你是说地址传递的情况么,由于int是内置类型,一定按值拷贝,来看对于引用引用类型的参数,在java里:
void method(type t)
{
t.value = newvalue;//改变了参数的内部状态
}
main()
{
type t1;
method(t1);//这个分号结束以后,t1的状态被改变了,对吧?为什么呢,因为method的参数t传递的就是t1的地址,虽然这里没有赋值表达式,但是他们上在函数调用的时候系统进行了传递(其实就是拷贝地址),那么,里面变了,外面也变了

}

我这么说够明确么?

我的认为是a,b的值不会发生任何变化。调用的meth函数没有改变a,b的值,传递参数只是按值传递,而没有按地址传递