精华内容
下载资源
问答
  • 引用传递和值传递

    2019-04-26 13:17:45
    引用传递和值传递值传递引用传值 值传递 1.主方法中的值传递 首先我们先看以下代码 public static void main(String[] args){ int a = 1; int b = a;//a传递给b System.out.println("a = "+a); System....

    引用传递和值传递

    值传递

    1.主方法中的值传递
    首先我们先看以下代码

    public static void main(String[] args){
    	int a = 1;
    	int b = a;//a传递给b
    	System.out.println("a = "+a);
    	System.out.println("b = "+b);
    	b = 2;
    	System.out.println("改变后a = "+a);
    	System.out.println("改变后b = "+b);
    }
    

    运行结果为
    a = 1b = 1改变后a = 1改变后b = 2
    在这里我们发现进行int类型的传递时,b的值进行了改变,a的值并没有一起发生变化,即可以说传递之后a和b就没有关系了。事实上我们去尝试其他基本类型(char、byte、int、float、double、long、short、boolean)的传递的时候,会发现它们之间传递的只是值而已,彼此各自发生变化都不会改变另一个的值。

    2.函数调用过程中的值传递
    我们平时会经常将一个对象作为参数传入函数,在函数内部对该参数进行修改,如下:
    我们想要改变a的值

    public static void change(int a,int b){
    	a = a+b;
    }	
    public static void main(String[] args){
    	int a = 1;
    	int b = 6;
    	//调用change()方法
    	change(a,b);
    	System.out.println("a = "+a+" b = "+b);
    }
    

    结果为:
    a = 1 b = 6
    结果并没有按照我们预想的进行a=a+b,改变a的值。原因是函数中的形式参数相当于是对a进行了一次拷贝,即只是将a的值传递给了形参,那么之后的就好理解了:无论我们对形参进行什么操作,a依旧是a,形式参数的变化不会对a造成任何影响。

    引用传值

    代码范例:

    public static void change(int[] a){
    	//	a=new int[2];
    		a[0] = 5;
    		a[1] = 9;
    	}
    	
    	public static void main(String[] args){
    		int[] a = new int[2];
    		a[0] = 0;
    		a[1] = 6;
    		change(a);
    		System.out.println("a[0] = "+a[0]+"  a[1] = "+a[1]);
    	}
    
    

    运行结果为:
    a[0] = 5  a[1] = 9
    这就是引用传递,我们将a的首地址传入方法,想象这时有一个叫做a的房间,我们有了它的门牌号,然后跟装修师傅说需要房间进行装修,那么师傅就会找到这个房间并进行相应的操作,即接下来在方法内部对形式参数的改变会影响到原来传入的值。
    细心的同学会发现在方法中有一个注释a=new int[2],如果我们将这个注释给解开,会出现什么结果呢?
    结果如下:
    a[0] = 0  a[1] = 6
    这不就像我们前面说的值传递了么?事实上它们还是有一点区别的。之所以会出现这样的结果,用下面的图来进行解释吧。
    解释
    开始的时候,我们传入了数组a的首地址,形式参数b(为了便于说明,事实上我们定义的是叫做a的形式参数)在堆中寻找并定位到a的位置,后来,我们在方法中创建了一个新的一维数组,并将它的首地址赋给了b,这个时候b就不再指向数组a的首地址了,那么方法中接下来做什么也不会影响到a了。

    最后,我们在进行传递过程中需要注意我们是否需要对之前的值进行改变,如果不需要,那就可以采用值传递;需要的话,那就采用引用传递。

    展开全文
  • Java的引用传递和值传递今天组长问我Java的值传递和应用传递是什么,写出个例子比较一下。刚开始想没什么难的,问度娘啊,不搜不要紧,一下子弄懵逼了。好多文章上来就说Java没有引用传递,只有值传递,坑爹啊,本来...

    Java的引用传递和值传递

    今天组长问我Java的值传递和应用传递是什么,写出个例子比较一下。刚开始想没什么难的,问度娘啊,不搜不要紧,一下子弄懵逼了。好多文章上来就说Java没有引用传递,只有值传递,坑爹啊,本来是明白的只是抄个代码而已,弄得自己都不知道怎么办了。搜了一下午,结合别人的思路自己总结了一下,关于Java的值传递和引用传递。

    直接上代码(有点简单,大家将就看吧):

    package com.passBy;

    public class PassBy {

    //test0岩石的是值传递

    public int test1(int num)

    {

    num = 10;

    return num;

    }

    //test1演示的是引用传递

    public void test2(Student stu)

    {

    stu.age = 20;

    }

    public static void main(String[] args) {

    PassBy passby = new PassBy();

    int value = 0;

    passby.test1(value);

    System.out.println("值传递: " + passby.test1(value));

    //引用传递前先创建引用student

    Student student = new Student();

    passby.test2(student);

    System.out.println("引用传递: " +student.age);

    }

    }

    package com.passBy;

    public class Student {

    int age = 15;

    }

    test1是值传递的方法,大家都能看得懂。实际就是把value=10拷贝进方法test1中,拷贝这个词很重要,他只是把10这个值传进去,互不影响,拷贝的是值,与其他无关。

    test2是引用传递,刚开始我没搞清引用是什么,弄得自己很难受。

    举个例子:

    Student student = new Student();

    student就是引用

    new Student()是对象

    这时候你在看test2代码,你就豁然开朗,我擦这么回事,区别是这个样子。这时候咱们来点高深的,前面说到值传递,只是将值拷贝传递下去。引用不一样,引用指向的是一个内存地址,将它传递下去,你对他修改就会有影响,因为前后引用都指向一个内存地址。

    网上关于Java是不是只有值传递,我是这么理解的,引用传递,传递的是一个内存地址。这个内存地址是一个值得形式传递的,所以Java只有值传递。我的看法是,没必要弄得那么死板,我觉得还是有点区别的,毕竟两种方式在内存方面分配是有些不同的,我们不能弄的太形而上学,那么较真,知识是不断进步的,有个发展的眼光也是不错的。

    下面我们在谈一谈两种方式的使用,基本类型都是值传递,注意String类型虽然不是基本类型,但他的使用有些特别貌似也是值传递(我也是个菜鸟,没看太明白),其他的是引用传递。

    这是我的很烂的总结与归纳,有不妥之处请大神指教,我来起个抛砖引玉的。

    展开全文
  • 关于Java传参时是引用传递还是值传递,是一个讨论比较多的话题,有说Java中只有值传递,也有些地方说引用传递和值传递都存在,本篇记录思考过程,不保证正确性,感兴趣的同学一起讨论。1.基本类型和引用类型在内存中...

    关于Java传参时是引用传递还是值传递,是一个讨论比较多的话题,

    有说Java中只有值传递,也有些地方说引用传递和值传递都存在,本篇记录思考过程,不保证正确性,

    感兴趣的同学一起讨论。

    1.基本类型和引用类型在内存中的保存

    Java中数据类型分为两大类,基本类型和对象类型。相应的,变量也有两种类型:基本类型和引用类型。

    基本类型的变量保存原始值,即它代表的值就是数值本身;

    而引用类型的变量保存引用值,"引用值"指向内存空间的地址,代表了某个对象的引用,而不是对象本身,

    对象本身存放在这个引用值所表示的地址的位置。

    基本类型包括:byte,short,int,long,char,float,double,Boolean,returnAddress,

    引用类型包括:类类型,接口类型和数组。

    相应的,变量也有两种类型:基本类型和引用类型。

    2.变量的基本类型和引用类型的区别

    基本数据类型在声明时系统就给它分配空间:

    int a;

    a=10;//正确,因为声明a时就分配了空间

    引用则不同,它声明时只给变量分配了引用空间,而不分配数据空间:

    Date date;

    //执行实例化,开辟数据空间存放Date对象,然后把空间的首地址传给today变量

    //date=new Date();

    //如果注释掉上一步操作

    //The local variable date may not have been initialized

    //也就是说对象的数据空间没有分配

    date.getDate();

    看一下下面的初始化过程,注意"引用"也是占用空间的,一个空Object对象的引用大小大概是4byte:

    Date a,b; //在内存开辟两个引用空间

    a = new Date();//开辟存储Date对象的数据空间,并把该空间的首地址赋给a

    b = a; //将a存储空间中的地址写到b的存储空间中

    3.引用传递和值传递

    这里要用实际参数和形式参数的概念来帮助理解,

    值传递:

    方法调用时,实际参数把它的值传递给对应的形式参数,函数接收的是原始值的一个copy,此时内存中存在两个相等的基本类型,即实际参数和形式参数,后面方法中的操作都是对形参这个值的修改,不影响实际参数的值。

    引用传递:

    也称为传地址。方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对应的形式参数,函数接收的是原始值的内存地址;

    在方法执行中,形参和实参内容相同,指向同一块内存地址,方法执行中对引用的操作将会影响到实际对象。

    看一个例子:

    class MyObj{

    public int b=99;

    }

    分别传参int和对象类型:

    public class ReferencePkValue2 {

    public static void main(String[] args) {

    ReferencePkValue2 t = new ReferencePkValue2();

    int a=99;

    t.test1(a);//这里传递的参数a就是按值传递

    System.out.println(a);

    MyObj obj=new MyObj();

    t.test2(obj);//这里传递的参数obj就是引用传递

    System.out.println(obj.b);

    }

    public void test1(int a){

    a=a++;

    System.out.println(a);

    }

    public void test2(MyObj obj){

    obj.b=100;

    System.out.println(obj.b);

    }

    }

    输出是:

    99

    99

    100

    100

    可以看到,int值没有发生变化,但是在test2方法中对obj类做的修改影响了obj这个对象。

    这里要特殊考虑String,以及Integer、Double等几个基本类型包装类,它们都是immutable类型,

    因为没有提供自身修改的函数,每次操作都是新生成一个对象,所以要特殊对待,可以认为是和基本数据类型相似,传值操作。

    看下面的例子:

    public class ReferencePkValue1 {

    public static void main(String[] args){

    ReferencePkValue1 pk=new ReferencePkValue1();

    //String类似基本类型,值传递,不会改变实际参数的值

    String test1="Hello";

    pk.change(test1);

    System.out.println(test1);

    //StringBuffer和StringBuilder等是引用传递

    StringBuffer test2=new StringBuffer("Hello");

    pk.change(test2);

    System.out.println(test2.toString());

    }

    public void change(String str){

    str=str+"world";

    }

    public void change(StringBuffer str){

    str.append("world");

    }

    }

    输出是:

    Hello

    Helloworld

    对String和StringBuffer的操作产生了不同的结果。

    4.结论

    结合上面的分析,关于值传递和引用传递可以得出这样的结论:

    (1)基本数据类型传值,对形参的修改不会影响实参;

    (2)引用类型传引用,形参和实参指向同一个内存地址(同一个对象),所以对参数的修改会影响到实际的对象;

    (3)String, Integer, Double等immutable的类型特殊处理,可以理解为传值,最后的操作不会修改实参对象。

    展开全文
  • 关于值传递和引用传递,我更喜欢说传递的都是拷贝。如果拷贝的这份东西就是一个,那就是,如果拷贝的东西指向的是一个对象,那就是引用传递。具体这个引用的会不会影响之前的,那还要看这个对象是否是可变...

    关于值传递和引用传递,我更喜欢说传递的都是拷贝。

    如果拷贝的这份东西就是一个值,那就是值,如果拷贝的东西指向的是一个对象,那就是引用传递。

    具体这个引用的值会不会影响之前的值,那还要看这个对象是否是可变对象,如果遇到类似于String 这样的不可变对象,传递的即便是new出来的对象,但进去的值也不会对传递前的值产生任何影响。其他的引用传递,一般都会对之前的对象值产生影响。

    --这是引论坛上别人说的话,觉得很有道理。

    以下是自己写的代码,mark一下。

    public class Test {

    String name = "柯辉";

    int age = 10;

    void t1() {

    Integer a = 1;

    String b = "周峰";

    t2(a);

    System.out.println("t2" + a);

    t3(a);

    System.out.println("t3" + a);

    t4(b);

    System.out.println("t4" + b);

    Test test = new Test();

    t5(test);

    System.out.println("t5" + "--" + test.age + "--" + test.name);

    }

    String t4(String b) {

    b += "草";

    return b;

    }

    void t5(final Test test) {

    test.setName("管子");

    test.setAge(5);;

    }

    int t2(int a) {

    a += 1;

    return a;

    }

    int t3(int a) {

    a += 1;

    return a;

    }

    public void setName(String name) {

    this.name = name;

    }

    public void setAge(int age) {

    this.age = age;

    }

    public static void main(String[] args) {

    Test test = new Test();

    test.t1();

    }

    }

    打印结果

    t21

    t31

    t4周峰

    t5--5--管子

    展开全文
  • 关于Java传参时是引用传递还是值传递,是一个讨论比较多的话题,有说Java中只有值传递,也有些地方说引用传递和值传递都存在,本篇记录思考过程,不保证正确性,感兴趣的同学一起讨论。1.基本类型和引用类型在内存中...
  • Java Object 引用传递和值传递 @author ixenos Java没有引用传递: 除了在将参数传递给方法(或函数)的时候是"值传递",传递对象引用的副本,在任何用"="向引用对象变量赋值的时候也是传递引用的副本 ...
  • 引用传递和值传递的区别

    千次阅读 2019-03-05 13:31:29
    1. 引用传递和值传递的区别 答:(1)按值传递不会改变实际参数的数值; (2)按引用传递可以改变实际参数的内容,但不能改变实际参数的参考地址。 例如: public class Test{ public static void main(String[] ...
  • 理解Java中的引用传递和值传递 关于Java传参时是引用传递还是值传递,一直是一个讨论比较多的话题, 有论坛说Java中只有值传递,也有些地方说引用传递和值传递都存在,比较容易让人迷惑。 关于值传递和引用传递...
  • 简单一点,引用传递和值传递的区别:值传递是传递了原有对象的一个副本,所以调用函数可以改变副本的值,但是对原有对象没有任何影响 引用传递是传递了对象的引用,对引用的操作会改变源对象本身 测试类: ...
  • 传递和引用传递python的值传递不会改变传入参数的值,而引用传递传入的是一个地址,有点类似c的指针,在执行完成之后会改变传入地址所指的值。值传递类型如下:上面的代码只是将a的值作为参数传递进去,程序执行完...
  • 理解Java中的引用传递和值传递 关于Java传参时是引用传递还是值传递,是一个讨论比较多的话题, 有说Java中只有值传递,也有些地方说引用传递和值传递都存在,本篇记录思考过程,不保证正确性, 感兴趣的同学一起...
  • java的引用传递和值传递
  • Java Object 引用传递和值传递@author ixenosJava没有引用传递:除了在将参数传递给方法(或函数)的时候是"值传递",传递对象引用的副本,在任何用"="向引用对象变量赋值的时候也是传递引用的副本参数传递,传递引用...
  • java引用传递和值传递的问题 1、首先明确一下值传递和引用传递的概念:  值传递:表示方法接收的是调用者提供的值。  引用传递:表示方法接收的是调用者提供的变量地址。 在Java中,变量分为以下两类: ①...
  • Java的引用传递和值传递今天组长问我Java的值传递和应用传递是什么,写出个例子比较一下。刚开始想没什么难的,问度娘啊,不搜不要紧,一下子弄懵逼了。好多文章上来就说Java没有引用传递,只有值传递,坑爹啊,本来...
  • 关于Java传参时是引用传递还是值传递,一直是一个讨论比较多的话题,有论坛说Java中只有值传递,也有些地方说引用传递和值传递都存在,比较容易让人迷惑。关于值传递和引用传递其实需要分情况看待,今天学习和分析...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 13,177
精华内容 5,270
关键字:

引用传递和值传递