黑马程序员技术交流社区

标题: 数组作为方法参数的问题 [打印本页]

作者: 万正    时间: 2012-3-21 17:55
标题: 数组作为方法参数的问题
把数组作为参数传入一个方法。在该方法中对数组进行一些操作:如果仅仅是插入数据项等一般操作,那么该操作会影响到数组本身;反之,如调整数组大小、对数组赋值等操作,则对数组本身没有影响。

请问其中的原理是什么呢?
  1. public class Tester {
  2.     public static void counter(int count) {
  3.         count = 2;
  4.     }
  5.    
  6.     public static void changeA1(int[] ints) {
  7.         int[] temp = { 4, 5, 6 };
  8.         ints = temp;
  9.     }

  10.     public static void changeA2(int[] ints) {
  11.         ints[0] = 4;
  12.         ints[1] = 5;
  13.         ints[2] = 6;
  14.     }

  15.     public static void main(String[] args) {
  16.         // Output: 1
  17.         // 基本数据类型没有改变。
  18.         int count = 1;
  19.         counter(count);
  20.         System.out.println("count: " + count);


  21.         int[] ints = { 1, 2, 3 };
  22.         
  23.         // Output: 1, 2, 3
  24.         // 对数组赋值,不会改变原始数组。
  25.         changeA1(ints);
  26.         for (int i = 0; i < ints.length; i++) {
  27.             System.out.print(ints[i] + " ");
  28.         }
  29.         
  30.         // Output: 4, 5, 6
  31.         // 可以对数组插入新的数据项。
  32.         System.out.println();
  33.         changeA2(ints);
  34.         for (int i = 0; i < ints.length; i++) {
  35.             System.out.print(ints[i] + " ");
  36.         }
  37.     }
  38. }
复制代码

作者: 陈从宾    时间: 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;   
}

作者: ♂诸侯♂    时间: 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