java中如何区分值传递和引用传递

java中值传递和引用传递一直饱受争议难以区分,下面我通过几个例子来区分一下什么时间是值传递,什么时间是引用传递

1:首先先说值传递:基本类型(int ,float ,long,byte,short ,double, char,boolean)作为参数传递时,是传递值的拷贝,无论你怎么改变这个拷贝,原值是不会改变的

package com.test.list;
public class Test1 {
     public static void main(String[] args) {
        int i = 10;
        System.out.println("before change "+i);
        change(i);
        System.out.println("After Change "+i);
    }
     public static void change(int i ){
         i=11;
     }
}

输出为:10

2:其中String类型在在传递过程中也当成基本类型来处理

这是因为str = “ppp” 相当于 new String(“ppp”);

public class Test2 {
     public static void main(String[] args) {
        String str = "abc";
        System.out.println("Before change "+str);
        change(str);
        System.out.println("After change " + str);
    }
     public static void change(String str){
         str = "ppp";
     }
}

输出为:abc

3:而引用传递过程相当于 把对象在内存中的地址拷贝了一份传递给了参数

public class Test3 {
     public static void main(String[] args) {
        StringBuffer sb = new StringBuffer("abc");
        System.out.println("Before change " + sb);
        change(sb);
        System.out.println("After change " + sb);
    }
     public static void change(StringBuffer str){
          str.append("ppp");//把对象在内存中的地址拷贝了一份传递给了参数
     }
}

查看本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/Java/

输出为:abcppp

再例如:

public class Test5 {
      public static void main(String[] args) {
        List<String> list = new ArrayList<String>();
        list.add("abcd");
        System.out.println("Before change "+list);
        change(list);
        System.out.println("After change "+list);
    }
      public static void change(List<String> list){
          list.add("ppp");
      }
}

输出为:abcdppp 如下图所示:

public class Test4 {
     public static void main(String[] args) {
            StringBuffer sb = new StringBuffer("abc");
            System.out.println("Before change " + sb);
            change(sb);
            System.out.println("After change " + sb);  

        }
         public static void change(StringBuffer str){
              str = new StringBuffer();//这里改变了引用 ,指向了另外一个地址,故输出还是没有改变
              str.append("ppp");
    }
}

输出为:abc 因为重新指向了另外一个内存空间

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索stringbuffer
, static
, system
, public
, java中的引用传递
, Change
, changed
, println
string引用传递
java 引用传递、java值传递和引用传递、java参数引用传递 int、java int引用传递、java参数引用传递,以便于您获取更多的相关知识。

时间: 2024-10-01 02:28:00

java中如何区分值传递和引用传递的相关文章

java及C++中传值传递、引用传递和指针方式的理解_java

java的值传递理解: 代码1: public class Test { /** * @param args */ public static void main(String[] args) { StringBuffer buffer= new StringBuffer("colin"); SChange(buffer); System.out.println( buffer); } public static void SChange (StringBuffer str) { st

Java中的值传递和引用传递

当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?     答:是值传递.Java 编程语言只有值传递参数.当一个对象实例作为一个参数被传递到方法中时,参数的值就是该对象的引用一个副本.指向同一个对象,对象的内容可以在被调用的方法中改变,但对象的引用(不是引用的副本)是永远不会改变的. Java参数,不管是原始类型还是引用类型,传递的都是副本(有另外一种说法是传值,但是说传副本更好理解吧,传值通常是相对传址而言).    

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

复制代码 代码如下: package Object.reference; public class People {     private String name;     private int age;     public People(){     }     public People(String name, int age) {         super();         this.name = name;         this.age = age;     }    

Java值传递和引用传递

先明晰一下文中值传递和引用传递的含义(关于对引用的定义的争议请参考评论区). 值传递:方法调用时,实参把它的值传递给对应的形参(或者说副本),方法执行中形式参数值的改变不影响实际参 数的值. 引用传递:也称为传地址.方法调用时,实参的引用(地址,而不是参数的值)被传递给方法中相对应的形参,在方法执行中,对形参的操作实际上就是对实参的操作,方法执行中形式参数值的改变将会影响实际参数的值. 两个看似没什么区别的代码 代码一 public static void main(String[] args)

对象-java传递 ”值传递和引用传递“还是全部 “值传递”

问题描述 java传递 "值传递和引用传递"还是全部 "值传递" 若说值传递.基本类型是copy的值赋给形参,对象是把 堆中对象的 地址 传给 形参. 若说分为值传递和引用传递..引用传递 是因为这个传的地址,导致实参和形参 操作的都是同一块内存. 有点乱,像文字层次上的撕逼.. 若往引用传递方面思考,C++的指针又把我搅乱了.,java里不能直接管理内存,传递的不是 变量本身 的栈地址.而是变量的内容(值) 解决方案 java没有什么值传递引用传递,都是传递对象引

java的值传递和引用传递

java的值传递和引用传递 1. "="是赋值操作. 任何包含=的如+=.-=. /=等等,都内含了赋值操作. 不再是你以前理解的数学含义了,而+ - * /和 = 在java中更不是一个级别,换句话说, = 是一个动作,一个可以改变内存状态的操作,一个可以改变变量的符号,而+ - * /却不会. 这里的赋值操作其实是包含了两个意思: 1.放弃了原有的值或引用: 2.得到了 = 右侧变量的值或引用.Java中对 = 的理解很重要啊!!可惜好多人忽略了,或者理解了却没深思过. 2. 对于

源自一个面试的问题:字符串在函数的参数中是当成值传递还是引用传递。

问题描述 源自一个面试的问题:字符串在函数的参数中是当成值传递还是引用传递.这是测试方法: public void setA(String a) { System.out.println("In the setmethod before set:解决方案二:# " + a); a = "I am a student"; System.out.println("In the setmethod after set:解决方案三:# " + a); }

请教关于JavaScript中的对象是按照值传递还是引用传递

问题描述 请教关于JavaScript中的对象是按照值传递还是引用传递 function SetName(obj){ obj.name="Tom";//执行之前,此时的obj和Person的name属性均为undefined obj1=new Object(); obj1=obj;//声明一个全局对象,那么obj.obj1和Person此时应该是同一个对象 }//SetName函数执行完之后,obj对象销毁,其余对象仍然存在 Person=new Object();//声明Person

Android For JNI(三)——C的指针,指针变量,指针常见错误,值传递,引用传递,返回多个值

Android For JNI(三)--C的指针,指针变量,指针常见错误,值传递,引用传递,返回多个值 C中比较难的这一块,大概就是指针了,所以大家还是多翻阅一下资料,当然,如果只是想了解一下,看本篇也就够了,不过我也尽量陈述的很详细 一.指针 要说指针,其实通俗易懂的话来说,他应该是保存内存地址的一个变量,我们来看一下小例子 #include <stdio.h> #include <stdlib.h> main(){ //int 变量 int i ; i = 5; //打印i的值