黑马程序员技术交流社区

标题: JAVA 函数参数的传递 谁举个例子说明一下啊 [打印本页]

作者: 沙漠里的小鱼    时间: 2012-2-12 19:52
标题: JAVA 函数参数的传递 谁举个例子说明一下啊
JAVA 函数参数的传递 谁举个例子说明一下啊
作者: 陈丹阳    时间: 2012-2-12 20:40
java函数总是传值的,但是如果是类、接口、数组本身就是引用类型所以传给函数的也是这个类的引用了。

JAVA中全部都是值传递!!!!{:soso_e105:}没有指针了
作者: 沙漠里的小鱼    时间: 2012-2-12 23:16
陈丹阳 发表于 2012-2-12 20:40
java函数总是传值的,但是如果是类、接口、数组本身就是引用类型所以传给函数的也是这个类的引用了。

JAVA ...

能不能讲的具体点啊 还是不大理解啊啊
作者: 蒙武辉    时间: 2012-2-13 00:03
java的函数参数传递有两种情况:

  1,基本数据类型是传递值,包括String

  2,object和其他自定义的数据类型或者对象,是传递引用的,也就是可以修改值,然后返回

作者: 戚雪晖    时间: 2012-2-13 09:40
本帖最后由 1毫秒的价值 于 2012-2-13 09:50 编辑

java中全部是值传递:
例1:(传基本数据类型)
public static int getInt(int x)
{
     x=x+1;
     return x;
}
当创建int b=6并将b传入该函数时:
getInt(b)的结果是7,这个时候由于是值传递,所以b本身是没有变化的,只是把b的值复制了一次在函数中进行了运算,返回一个新的值。这时候你打印b的值,还是6;
例2:(传入引用数据类型)
class Person
{
    int age=10;
}
public static int getAge(Person p)
{
     p.age=p.age+1;
     return p.age;
}
当你创建Person p=new Person()时,初始化age为10,作为参数传入函数的时候,他传递的是地址值,而不是该地址值上对象的属性及行为。调用函数进行计算,调用的是该地址值上对象的属性计算(改变了对象的内容),返回为地址值上对象的年龄为11,这样改变的是对象的内容,而p的地址是没变的,因此,再打印p.age(因为他的地址值没变,打印的还是这个对象的内容,但内容在调用函数时被改变了,所以打印结果也是11)。你可以打印调用前后的p对象的hashcode,是一样的。
作者: 孙汇川    时间: 2012-2-13 14:57
楼上讲的很细了,没有必要再重复,有什么不明白的再问,再给你回答。
作者: maochong    时间: 2012-2-13 18:37
在阅读本文之前,根据自己的经验和理解,大家可以先思考并选择一下Java函数的参数传递方式:
A. 是按值传递的?
B. 按引用传递的?
C. 部分按值部分按引用?
此处暂不宣布正确答案,我们通过一个简单的例子让大家自己找答案:
1. 先定义一个类型Value

Java代码  
1.public static class Value {   
2.    private String value = "value";   
3.    public String getValue() { return value; }   
4.    public void setValue(String value) { this.value = value; }   
5.}  
public static class Value {
        private String value = "value";
        public String getValue() { return value; }
        public void setValue(String value) { this.value = value; }
}
2. 写两个函数newValue和modifyValue:newValue会将入参指向一个新的对象,modifyValue会调用入参的setValue方法修改对象的value值。

Java代码  
1.public static void newValue(Value value) {   
2.    value = new Value();   
3.    value.setValue("new value");   
4.    System.out.println("In newValue, HashCode = " + value.hashCode() + ", value = " + value.getValue());   
5.}   
6.      
7.public static void modifyValue(Value value) {   
8.    value.setValue("new value");   
9.    System.out.println("In modifyValue, HashCode = " + value.hashCode() + ", value = " + value.getValue());   
10.}  
public static void newValue(Value value) {
        value = new Value();
        value.setValue("new value");
        System.out.println("In newValue, HashCode = " + value.hashCode() + ", value = " + value.getValue());
}
       
public static void modifyValue(Value value) {
        value.setValue("new value");
        System.out.println("In modifyValue, HashCode = " + value.hashCode() + ", value = " + value.getValue());
}
3. 简单的测试代码

Java代码  
1.public static void main(String[] args) {   
2.    Value value1 = new Value();   
3.    System.out.println("Before modify, HashCode = " + value1.hashCode() + ", value = " + value1.getValue());   
4.    // 将value1指向新的Value对象   
5.    newValue(value1);   
6.    System.out.println("After modify, HashCode = " + value1.hashCode() + ", value = " + value1.getValue() + "\n");   
7.    Value value2 = new Value();   
8.    System.out.println("Before modify, HashCode = " + value2.hashCode() + ", value = " + value2.getValue());   
9.    // 使用object的set方法,修改对象的内部值   
10.    modifyValue(value2);   
11.    System.out.println("After modify, HashCode = " + value2.hashCode() + ", value = " + value2.getValue());   
12.}  
public static void main(String[] args) {
        Value value1 = new Value();
        System.out.println("Before modify, HashCode = " + value1.hashCode() + ", value = " + value1.getValue());
        // 将value1指向新的Value对象
        newValue(value1);
        System.out.println("After modify, HashCode = " + value1.hashCode() + ", value = " + value1.getValue() + "\n");
        Value value2 = new Value();
        System.out.println("Before modify, HashCode = " + value2.hashCode() + ", value = " + value2.getValue());
        // 使用object的set方法,修改对象的内部值
        modifyValue(value2);
        System.out.println("After modify, HashCode = " + value2.hashCode() + ", value = " + value2.getValue());
}
4. 执行结果日志:

Java代码  
1.Before modify, HashCode = 12677476, value = value   
2.In newValue, HashCode = 33263331, value = new value   
3.After modify, HashCode = 12677476, value = value   
4.  
5.Before modify, HashCode = 6413875, value = value   
6.In modifyValue, HashCode = 6413875, value = new value   
7.After modify, HashCode = 6413875, value = new value  
Before modify, HashCode = 12677476, value = value
In newValue, HashCode = 33263331, value = new value
After modify, HashCode = 12677476, value = value

Before modify, HashCode = 6413875, value = value
In modifyValue, HashCode = 6413875, value = new value
After modify, HashCode = 6413875, value = new value

5. 结果分析:
上述代码这是非常常见的一种编程模式:在外围定义|保存|获取一个值或对象,将这个对象作为参数传入一个方法,在方法中修改对象的属性、行为。但两个方法newValue和modifyValue的修改方式不一样,在方法调用之后,该对象在外围看来也有很大的差别!如何理解这种差异呢?先温故一下按值传递、按引用传递的概念:
* 按值传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的一个副本。因此,如果函数修改了该参数,仅改变副本,而原始值保持不变。
* 按引用传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的内存地址,而不是值的副本。因此,如果函数修改了该参数,参数的原始值(函数块之外的调用代码中)也随之改变。





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2