精华内容
下载资源
问答
  • java中的参数传递(只有值传递没有引用传递)

    万次阅读 多人点赞 2019-07-31 19:25:14
    Java中只有传值调用(值传递),没有传址调用(址传递或者引用传递)。所以在java方法中改变参数的值是不会改变原变量的值的,但为什么改变引用变量的属性值却可以呢?请看下面的解答。 java中的数据类型 Java中...

    Java中只有传值调用(值传递),没有传址调用(址传递或者引用传递)。所以在java方法中改变参数的值是不会改变原变量的值的,但为什么改变引用变量的属性值却可以呢?请看下面的解答。

    java中的数据类型

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

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

    而引用类型的变量保存的值是引用值,"引用值"指向内存空间的地址,代表了某个对象的引用,而不是对象本身,对象本身存放在这个引用值所表示的地址的位置。

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

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

    java中只有值传递

    在日常编码中,会经常看到如下现象:

    1、对于基本类型参数,在方法体内对参数进行重新赋值,不会改变原有变量的值。

    2、对于引用类型参数,在方法体内对参数进行重新赋予引用,不会改变原有变量所持有的引用。

    3、方法体内对参数进行运算,不会改变原有变量的值。

    4、对于引用类型参数,方法体内对参数所指向对象的属性进行操作,将改变原有变量所指向对象的属性值。

    举个例子:

    public class Main {
    
        private static void getMiddleOne(boolean b, Boolean boo, Boolean[] arr){
    
            b = true;
    
            boo = new Boolean(true);
    
            arr[0] = true;
    
        }
    
           //测试
    
        public static void main(String[] args) {
    
            boolean b = false;
    
            Boolean boo = new Boolean(false);
    
            Boolean[] arr = new Boolean[]{false};
    
            getMiddleOne(b, boo, arr);
    
            System.out.println(b);
    
            System.out.println(boo.toString());
    
            System.out.println(arr[0]);
    
            /**
    
            * output:
    
            * false
    
            * false
    
            * true
    
            */
    
        }
    
    }

    我们只要了解了下面两点就可以解答上面的现象了:

    1、基本数据类型的值就是数值本身,所以示例中的b的值就是false;包装类因为会自动装箱拆箱,所以可以和基本类型一样处理,所以示例中boo的值就是false;数组是引用类型,所以arr的值就是指向该Boolean[]的引用。

    2、java中只有值传递没有引用传递,所以传入getMiddleOne方法的三个参数分别是b的值拷贝, boo的值拷贝, arr的值拷贝。

    通过上面两点就可以清楚了,getMiddleOne方法中执行的 b=true 和 boo = new Boolean(true) 都是把新值赋给了他们的拷贝,所以不改变原变量的值;同样,arr[0] = true 是把true复制给了arr的拷贝所指向的数组的第一个元素,arr的值和arr的拷贝的值都是该数组的引用,所以arr的拷贝所指向的数组和arr所指向的数组是同一个,所以改变arr的拷贝的数组的元素会同样影响到原变量arr。

    总结

    java中只有值传递,基本类型传递的是值的副本,引用类型传递的是引用的副本。

     

    展开全文
  • 通过递归加深引用传递和常引用传递的区别,同时加深递归回溯的过程 void process(string& str) { if (str.size() >= 5) { cout << str << ",return" << endl; return; } cout <...

    通过递归加深引用传递和常引用传递的区别,同时加深递归回溯的过程

    void process(string& str) {
    	if (str.size() >= 5) {
    		cout << str << ",return" << endl;
    		return;
    	}
    	cout << str<<endl;
    	str += '1';
    	process(str);
    	cout << str << endl;
    }
    int main() {
    	string str = "";
    	process(str);
    	cout << "final,"<< str << endl;
    	while (1);
    	return 0;
    }
    
    1
    11
    111
    1111
    11111,return
    11111
    11111
    11111
    11111
    11111
    final,11111
    

    该函数在递归中每一次都修改str的值,注意传递的是引用传递,所以每一次对str的修改都会改变str中真实的值,所以在递归调用回溯过程中输出str最后都是11111;

    void process(const string& str) {
    	if (str.size() >= 5) {
    		cout << str << ",return" << endl;
    		return;
    	}
    	cout << str<<endl;
    	process(str+'1');
    	cout << str << endl;
    }
    int main() {
    	string str = "";
    	process(str);
    	cout << "final,"<< str << endl;
    	while (1);
    	return 0;
    }
    
    1
    11
    111
    1111
    11111,return
    1111
    111
    11
    1
    
    final,
    

    传递的是引用常量参数,所以在不会修改原str的值,并且在回缩过程中每个临时变量的str都不一样。

    展开全文
  • 值传递和引用传递

    2018-06-18 18:41:43
    值传递的参数都是基本数据类型(如int、longchar等),在值传递里,所以的参数传递都采用值传递的方式,就是传递参数到方法时,方法获得的只是一个副本,所以方法不会改变参数变量的值,只是使用该参数变量的值...

    1、值传递

    值传递的参数都是基本数据类型(如int、long和char等),在值传递里,所以的参数传递都采用值传递的方式,就是传递参数到方法时,方法获得的只是一个副本,所以方法不会改变参数变量的值,只是使用该参数变量的值(如果想要改变实际参数的值,可以把实际参数变为引用类型,变成引用传递就好了)

    2、引用传递

    引用传递指参数传递的是引用数据类型,则方法获得的是这个对象的内存地址,所以方法可以改变对象的属性,但不能改变对象本身

    /**
     * 值传递
     */
    public static void main(String[] args) {
        	int x = 10;
        	int y = 20;
        	System.out.println("传递前的值:x="+x+",y="+y);
        	add(x,y);
        	System.out.println("传递后的值:x="+x+",y="+y);
    	}
    
    	/**
    	 * @param x
    	 * @param y
    	 */
    	private static void add(int x, int y) {
    		 int k = x+y;
    		 y = x;
    	     x = k;
    	     System.out.println("add方法中的值:x="+x+",y="+y);
    	}
    }
    

    运行结果:

    传递前的值:x=10,y=20
    add方法中的值:x=30,y=10
    传递后的值:x=10,y=20
    
    /**
     * 引用传递
     */
    class Student {
    	int number;
    	public Student(int number) {
    		this.number = number;
    	}
    }
    public class TestDemo5 {
    	public static void change(Student s) {
    		s.number = 2000;
    	}
        public static void main(String[] args) {
        	Student stu = new Student(10);
        	System.out.println("引用传递前:"+stu.number);
        	change(stu);
        	System.out.println("引用传递后:"+stu.number);
    	}
    }
    

    运行结果:

    引用传递前:10
    引用传递后:2000
    

    引用传递过程解析:
    在程序执行到Student stu = new Student(10)时,分别在栈内存(储存对象的引用)和堆内存(储存对象)开辟空间供对象stu使用,程序执行到change()方法时,将对象stu的副本作为参数传递到change()方法,形参与实参指向同一地址,即同一对象,change()方法通过形参堆stu对象的属性number进行操作并改变了number的值,这一改变结果保留在对象中,但change()方法执行结束后,形参的引用被断开,但stu还是指向已经被改变的对象,所以最好stu.number=2000;

    这里写图片描述

    但是注意:
    String用于引用传递,传形参后,执行完方法,变量的值并不会改变,这是因为String不可变的特性;

    public class Test2 {
        public static void main(String[] args) {
            String s = "诸葛亮";
            System.out.println("引用传递前:"+s+"----"+System.identityHashCode(s));//获取当前对象的引用地址
            change(s);
            System.out.println("引用传递后:"+s+"----"+System.identityHashCode(s));
    
        }
    
        public static void change(String s) {
            System.out.println("方法里面:"+s+"----"+System.identityHashCode(s));
            s = "司马懿";
            System.out.println("方法里面:"+s+"----"+System.identityHashCode(s));
        }
    }
    

    运行结果:

    引用传递前:诸葛亮----5896993
    方法里面:诸葛亮----5896993
    方法里面:司马懿----24537094
    引用传递后:诸葛亮----5896993
    
    展开全文
  • 引用传递和值传递

    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值传递和引用传递

    2019-03-24 20:25:52
    JAVA传递参数有值传递和引用传递: 值传递是传递数据:如基本数据类型都是值传递 引用传递是把形参和实参的指针指向了堆中的同一对象,对象的引用和数组的引用。 实参,Java的基本数据类型,如int,double等在...
  • java中参数传递只有值传递,与java不同,C++中的参数传递方式有三种,分别是 值传递 指针传递和引用传递,值传递和指针传递都知识传递当前参数的一个副本,而引用传递则是直接传递参数,所以在函数中改变参数的值就...
  • 变量的值传递引用传递,值传递引用传递的区别
  • Java面向对象值传递和引用传递Java面向对象值传递和引用传递Java面向对象值传递和引用传递Java面向对象值传递和引用传递
  • JavaScript有5种基本的数据类型,分别是:布尔、null、undefined、String和Number。这篇文章主要介绍了JavaScript的值传递和引用传递,需要的朋友可以参考下
  • C值传递和引用传递

    2017-05-14 12:53:34
    值传递和引用传递最熟悉的例子应该是两个参数的交换了,我们知道值传递中对形参的修改不会影响实参,引用传递中对形参的修改会作用于实参。那么为什么会这样呢? 值传递的例子#include #include <stdlib.h>void ...
  • Java值传递和引用传递

    2016-08-06 15:09:51
    区分值传递和引用传递(很重要) 基本数据类型赋值属于值传递;引用类型之间赋值属于引用传递 值传递传递的是实实在在的变量值;引用传递传递的是对象的引用地址 值传递后,两个变量改变的是各自的值;引用传递后,...
  • 1.值传递: 在值传递过程中,形式参数类型是基本数据类型,当用方法调用时,实际参数将它的实际值传递给形式参数,此传递过程就是将实参的值复制一份传递给形参,而形参只是用实参的参数值初始化自己的存储单元内容...
  • 值传递 引用传递

    2021-01-24 01:38:12
    值传递 引用传递 涉及到内存中存储数据得问题,在方法中调用得情况下; 值传递:将值作为参数传递到方法中,进行操作,不影响原本数据值;针对基本数据类型 引用传递:将引用类型数据作为参数传递到方法中,对这...
  • Java值传递和引用传递详细说明

    千次阅读 2020-07-14 15:53:17
    学过Java基础的人都知道:值传递和引用传递是初次接触Java时的一个难点,有时候记得了语法却记不得怎么实际运用,有时候会的了运用却解释不出原理,而且坊间讨论的话题又是充满争议:有的论坛帖子说Java只有值传递,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,877,841
精华内容 751,136
关键字:

引用传递和常引用传递