黑马程序员技术交流社区
标题:
数组作为方法参数的问题
[打印本页]
作者:
万正
时间:
2012-3-21 17:55
标题:
数组作为方法参数的问题
把数组作为参数传入一个方法。在该方法中对数组进行一些操作:如果仅仅是插入数据项等一般操作,那么该操作会影响到数组本身;反之,如调整数组大小、对数组赋值等操作,则对数组本身没有影响。
请问其中的原理是什么呢?
public class Tester {
public static void counter(int count) {
count = 2;
}
public static void changeA1(int[] ints) {
int[] temp = { 4, 5, 6 };
ints = temp;
}
public static void changeA2(int[] ints) {
ints[0] = 4;
ints[1] = 5;
ints[2] = 6;
}
public static void main(String[] args) {
// Output: 1
// 基本数据类型没有改变。
int count = 1;
counter(count);
System.out.println("count: " + count);
int[] ints = { 1, 2, 3 };
// Output: 1, 2, 3
// 对数组赋值,不会改变原始数组。
changeA1(ints);
for (int i = 0; i < ints.length; i++) {
System.out.print(ints[i] + " ");
}
// Output: 4, 5, 6
// 可以对数组插入新的数据项。
System.out.println();
changeA2(ints);
for (int i = 0; i < ints.length; i++) {
System.out.print(ints[i] + " ");
}
}
}
复制代码
作者:
陈从宾
时间:
2012-3-21 18:25
本帖最后由 陈从宾 于 2012-3-21 18:29 编辑
感觉楼主对变量的作用域以及形参和实参的概念还不是特别清楚。
局部变量:在一个函数或函数里而把代码块中定义的变量称为局部变量,局部变量在函数或代码块被执行时创建,在函数或代码块结束时被销毁。
首先在函数:
public static void changeA1(int[] ints) {
int[] temp = { 4, 5, 6 };
ints = temp;
}
其中的引用变量temp的作用域是changeA1的函数体内,而该函数的参数ints为形参,当你调用该方法并给她传递参数,而你30-32行代码输出打印的是main方法中的局部变量ints。
作者:
陈汉帆
时间:
2012-3-21 19:22
public static void changeA1(int[] ints) {
07. int[] temp = { 4, 5, 6 };
08. ints = temp;
09. }
你想把temp数组的值赋给ints,但形参的ints和你主方法的ints是完全不同的,你在changeA1方法体内,创建了一个数组对象,方法体结束时,就销毁了;
如果想要changeA1方法对数组进行操作,应该把数组的引用传递给方法的形参,
代码修改一下
public static void changeA1(int[] temp) {
temp[0]=4;
temp[1]=5;
temp[2]=6;
}
SH{M)TBKI%IGK@TN5VJO9LS.jpg
(50.52 KB, 下载次数: 26)
下载附件
2012-3-21 19:21 上传
作者:
♂诸侯♂
时间:
2012-3-21 19:46
方法上声明的就是形参 方法内使用的是实际参数。
这个讲的比较好。讲实参,形参和堆栈。
当你在定义一个方法的时候,比如 void setter(int i){};
其中的参数i就是形参 形参是这个方法的局部变量 只能在方法体中使用
当你调用这个方法的时候,比如setter(a);
此时a就是实参 实参a把他的值传递给形参i
基本数据类型实参传递给形参的是值
对象实参传递给形参的是对象的引用
在java语法中,数组变量是对象类型,所以参数传递的是引用.
基本数据类型就8种,记住就好了。除了这些都是引用型的了。
java四类八种基本数据类型 整型 byte short int long
浮点型 float double
逻辑型 boolean(它只有两个值可取true false)
字符型 char
引用数据类型:是数据的引用在栈中,但是他的对象在堆中。
堆是先进先出,而栈是先进后处
1. 栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。
2. 栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。另外,栈数据可以共享,详见第3点。堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2