“在调用方法时,若要使方法改变实参的值”这句话什么意思
6.在调用方法时,若要使方法改变实参的值,可以(B)
A) 用基本数据类型作为参数
B) 用对象作为参数
C) A和B都对
D) A和B都不对 展开
这里你可能得理解一下实参和形参的概念。
在调用函数时,会给参数赋一个临时名称用于函数内部,这个名称(参数名)叫做形参,实际传入方法的参数,叫实参。
例如方法
echo(Point p)
其中的p就是一个形参,在方法echo中可以使用标识p来引用。
而调用该方法时,需要一个外部变量,如下
Point x= new Point(1,2);//Point类只是一个例子,换成其他东西不影响理解
echo(x)
那么此处的x就是实参,在方法外部可以使用。
因此,实参的作用域在方法外,形参的作用域在方法内。
更进一步,面向对象语言中,基本类型和对象在参数传递的过程中,有不同的形式:
对于基本类型,传递的时候,将实参值复制,方法内获得的形参与实参没有关系,只是值相同,称为值传递,在方法中修改形参不影响实参;
对于对象,传递的时候,将实参引用复制,形参与实参引用相同,指向的是同一个对象,称为引用传递,在方法中修改形参会影响实参;
此处还有一种例外,对于类似String这种的不变类,仍然是引用传递,形参和实参相同。但修改时是创建了一个新对象赋给形参,这当然不会影响实参;
综上,题目选B。
最后,为什么要分引用传递与值传递呢?其实是面向对象语言中对于基本类型和对象的储存方法不同:
基本类型类型简单,长度固定,只有一个在栈上的值来表示;
对象类型复杂,长度不固定,有一个在栈上的值来表示地址(引用),通过此地址来访问堆上的实际数据;
方法传递时,将栈上的对应值(实参)复制,传递给另一个方法(形参);
此时,对于基本类型,复制了值,就是值传递;对于对象,复制了地址,但堆上的实际数据相同,就是引用传递。
更具体的堆栈学习,在进一步的书籍中看吧,简单提一句:栈用于方法调用,堆用于数据存储。