`
249009188
  • 浏览: 47649 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

java 值传递和引用传递

阅读更多


class Demo{
 private static int num= 2;
 public static void changePri(int a){
  a = 10;
 }
public static int changeObj(Demo demo){
 demo.num = 5;
return demo.num;
}
 public static void main(String[] args) {
   int a = 12;
  changePri(a);
   System.out.println(a);//12
  Demo demo = new Demo();
  changeObj(demo);
  System.out.println(demo.num);//5

 }
}

  
这段代码的主要部分调用了两个很相近的方法,changeObj()和changePri()。唯一不同的是它们一个把对象作为输入参数,另一个把Java中的基本类型int作为输入参数。并且在这两个函数体内部都对输入的参数进行了改动。
  java中的八大基本数据类型:int long float double short byte char boolean

看似一样的方法,程序输出的结果却不太一样。changeObj()方法真正的把输入的参数改变了,而changePri()方法对输入的参数没有任何的改变。

从这个例子知道Java对对象和基本的数据类型的处理是不一样的。和C语言一样,当把Java的基本数据类型(如int,char,double等)作为入口参数传给函数体的时候,传入的参数在函数体内部变成了局部变量,这个局部变量是输入参数的一个拷贝,所有的函数体内部的操作都是针对这个拷贝的操作,函数执行结束后,这个局部变量也就完成了它的使命,它影响不到作为输入参数的变量。

这种方式的参数传递被称为"值传递"。而在Java中用对象的作为入口参数的传递则缺省为"引用传递",也就是说仅仅传递了对象的一个"引用",这个"引用"的概念同C语言中的指针引用是一样的。当函数体内部对输入变量改变时,实质上就是在对这个对象的直接操作。

class MyDemo {  
  
    public static void operate(StringBuffer x, StringBuffer y) {  
        x.append(y);  
        y = x;  
        System.out.println(x + "," + y);  
    }  
  
    public static void main(String[] args) {  
        StringBuffer a = new StringBuffer("A");  
        StringBuffer b = new StringBuffer("B");  
        operate(a, b);  
        System.out.println(a + "," + b);  
    }  
}  
  
结果:  
AB,AB  
AB,B  


解释:  
很明显你这里传递的是地址(引用)传递2个StringBuffer 对象!   
  
注意啦:   
x 会指向 a 所指向的内存(可以理解为都指向A),y 会指向 b 所指向的内存,(可以理解为都指向B)   
x.append(y); //这句话把 y 指向的值追加给x指向的值,这个时候x 和a 指向的内存都是AB,y指向的内存仍然是B   
y=x;//这句话就是把 x 的值 附值给 y, 附的是地址!   
  
这样 a,y,x 同时值向 AB,b仍然指向 B   
  
System.out.println(x+","+y); 这里所以打印 AB,AB   
System.out.println(a+","+b); 这里所以打印 AB ,B   
  
引用参数的传递是把原来的地址传递给新的变量,原来引用的仍然在那里! 


下面还是例子:

//在函数中传递基本数据类型,     
public class Test {     
              
    public static void change(int i, int j) {     
        int temp = i;     
        i = j;     
        j = temp;     
    }     
    
    public static void main(String[] args) {     
        int a = 3;     
        int b = 4;     
        change(a, b);     
    
        System.out.println("a=" + a);     
        System.out.println("b=" + b);     
    }     
}     
    
结果为:     
a=3    
b=4    
原因就是 参数中传递的是 基本类型 a 和 b 的拷贝,在函数中交换的也是那份拷贝的值 而不是数据本身; 
 

public class Test {     
    
    public static void change(int[] counts) {     
        counts[0] = 6;     
        System.out.println(counts[0]);     
    }     
    
    public static void main(String[] args) {     
        int[] count = { 1, 2, 3, 4, 5 };     
        change(count);     
    }     
}     
 结果是:6   
在方法中 传递引用数据类型int数组,实际上传递的是其引用count的拷贝,他们都指向数组对象,在方法中可以改变数组对象的内容。即:对复制的引用所调用的方法更改的是同一个对象。


这个要和下面的比较下:  
class A {     
    int i = 0;     
}     
    
    
public class Test {     
    
    public static void add(A a) {     
        a = new A();     
        a.i++;     
    }     
         
    public static void main(String args[]) {     
        A a = new A();     
        add(a);     
        System.out.println(a.i);     
    }     
}     
    
输出结果是0    
在该程序中,对象的引用指向的是A ,而在change方法中,传递的引用的一份副本则指向了一个新的OBJECT,并对其进行操作。     
而原来的A对象并没有发生任何变化。 引用指向的是还是原来的A对象。  
  
class A {     
    int i = 0;     
}     
    
    
public class Test {     
    
    public static void add(A a) {     
        //a = new A();     
        a.i++;     
    }     
         
    public static void main(String args[]) {     
        A a = new A();     
        add(a);     
        System.out.println(a.i);     
    }     
}     
    
输出结果是1     



String 不改变,数组改变  
public class Example {     
    String str = new String("good");     
    
    char[] ch = { 'a', 'b', 'c' };     
    
    public static void main(String args[]) {     
        Example ex = new Example();     
        ex.change(ex.str, ex.ch);     
        System.out.print(ex.str + " and ");     
        System.out.println(ex.ch);     
    }     
    
    public void change(String str, char ch[]) {     
        str = "test ok";     
        ch[0] = 'g';     
    }     
}      
程序3输出的是 good and gbc.     
String 比较特别,看过String 代码的都知道, String 是 final的。所以值是不变的。 函数中String对象引用的副本指向了另外一个新String对象,而数组对象引用的副本没有改变,而是改变对象中数据的内容.     
对于对象类型,也就是Object的子类,如果你在方法中修改了它的成员的值,那个修改是生效的,方法调用结束后,它的成员是新的值,但是如果你把它指向一个其它的对象,方法调用结束后,原来对它的引用并没用指向新的对象。
分享到:
评论

相关推荐

    java 值传递和引用传递的比较

    在Java编程语言中,了解值传递和引用传递的概念至关重要,因为它们直接影响到函数参数的处理方式。下面将详细探讨这两个概念及其区别。 首先,我们来理解什么是值传递。在Java中,基本数据类型(如int、double、...

    Java:按值传递还是按引用传递详细解说

    在Java编程语言中,关于参数传递的方式一直存在两种观点:一种认为Java仅支持按值传递,另一种则指出Java同时支持按值传递和按引用传递。实际上,这两种观点并非完全对立,而是根据不同的角度来描述Java中的参数传递...

    java值传递和引用传递详解

    Java中的参数传递方式主要有两种:值传递和引用传递。理解这两种机制是编程中至关重要的,因为它们直接影响到函数内部如何改变或操作传入的数据。 **值传递**在Java中是基本数据类型(如int, double, char等)的...

    java值传递与引用传递

    在Java编程语言中,函数参数的传递方式有两种:值传递和引用传递。理解这两种机制对于编写高效、无误的代码至关重要。以下是对这两种传递方式的详细解析。 首先,值传递是指函数调用时,实际参数的值被复制一份传给...

    Java 值传递和引用传递详解及实例代码

    Java中的值传递和引用传递是编程中非常重要的概念,它们涉及到函数或方法调用时参数的传递方式。值传递指的是函数或方法接收到的是变量的一个副本,而引用传递则是函数或方法接收到的是变量内存地址的副本。这两种...

    Java面向对象值传递和引用传递

    Java 面向对象值传递和引用传递 Java 面向对象编程中,参数传递是非常重要的一个概念。参数传递有两种方式:值传递和引用传递。了解这两种方式的区别是非常重要的,因为它们对程序的执行结果产生了很大的影响。 值...

    值传递和引用传递

    本文将详细介绍值传递和引用传递的概念、用法以及它们之间的区别,并通过Java语言中的具体示例来加深理解。 #### 二、值传递 **值传递**是指在函数或方法调用时,传递给函数的实际参数的值被复制一份到形参,即形参...

    13.java参数传递之引用传递.zip

    13.java参数传递之引用传递.zip13.java参数传递之引用传递.zip13.java参数传递之引用传递.zip13.java参数传递之引用传递.zip13.java参数传递之引用传递.zip13.java参数传递之引用传递.zip13.java参数传递之引用传递....

    java学习java语言的值传递和引用传递

    java学习java语言的值传递和引用传递

    Java中值传递和引用传递的区别

    Java中值传递和引用传递的区别详解 Java中值传递和引用传递是两个重要的参数传递机制,它们在程序设计中发挥着至关重要的作用。了解这两种机制的区别对于程序员来说是非常必要的。本文将通过示例代码详细介绍Java...

    Java中的值传递和引用传递实例介绍

    我们将详细探讨Java中的值传递和引用传递的概念,以及它们之间的区别。 首先,值传递是Java中最基本的参数传递方式。当一个变量作为参数传递给方法时,实际上是传递了该变量存储值的一个副本。这意味着在方法内部对...

    Java值传递和引用传递详解

    Java中的参数传递方式有两种,即值传递和引用传递,但需要注意的是,Java只支持值传递。下面我们将详细探讨这两种传递方式及其在实际编程中的表现。 1. 值传递(Value Passing) 值传递指的是在调用方法时,将变量...

    Java语言中参数值传递和引用传递比较.pdf

    Java 语言中参数值传递和引用传递比较 Java 语言中参数值传递和引用传递是两种不同的参数传递方式,它们在 Java 编程中扮演着重要的角色。参数值传递是指将实际参数的值复制给形式参数,形式参数的变化不影响实际...

    java参数传递时到底是值传递还是引用传递分享.pdf

    Java中参数传递的方式有两种理解:值传递和引用传递,但这两种说法实际上是对同一种机制的不同角度的描述。下面将详细解释这两种理解方式。 首先,我们来看值传递的理解。在Java中,当一个对象作为参数传递给方法时...

    Java中的值传递和引用传递

    当一个变量为一个参数传入方法内部的时候,会有两种不同的传递方式:值传递和引用传递。  值传递的特点:不管方法内部对传进去的参数作任何改变,也不会影响方法外部的变量的值  引用传递的特点:方法内部对传...

    Java是值传递,传对象引用也是通过值

    总的来说,理解Java中的值传递和对象引用传递对于编写高效、无误的代码至关重要。无论是基本类型还是对象类型,参数传递都是以值的形式进行,但对象类型的值是其引用,允许我们在方法内修改对象的状态,而不影响方法...

    Java中的值传递和引用传递的区别.doc

    Java 中的值传递和引用传递的区别 Java 中的值传递和引用传递是两个不同的参数传递机制。值传递是指当基本数据类型作为入口参数传给函数体时,传入的参数在函数体内部变成了局部变量,这个局部变量是输入参数的一个...

    java中的值传递和引用传递[汇编].pdf

    Java编程语言中,参数传递的方式主要有两种:值传递和引用传递。然而,由于Java不支持指针,所以严格意义上的引用传递并不存在。但是,通过对象的传递,Java实现了类似引用传递的效果。 值传递是Java中基本类型的...

Global site tag (gtag.js) - Google Analytics