Java传参的三种情况
Java中的参数传递
Java中的参数传递
实参与形参
1. 形式参数:是在定义函数名和函数体的时候使⽤的参数,⽬的是⽤来接收调⽤该函数时传⼊的参数。
2. 实际参数:在调⽤有参函数时,主调函数和被调函数之间有数据传递关系。
在主调函数中调⽤⼀个函数时,函数名后⾯括号中的参数
称为“实际参数”。
3. 实际参数是调⽤有参⽅法的时候真正传递的内容,⽽形式参数是⽤于接收实参内容的参数。
值传递和引⽤传递
1. 值传递(pass by value):是指在调⽤函数时将实际参数复制⼀份传递到函数中,这样在函数中如果对参数进⾏修改,将不会影响到实
际参数。
2. 引⽤传递(pass by reference):是指在调⽤函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进⾏的修改,将影响
到实际参数。
传共享对象调⽤(共享对象传递)
传共享对象调⽤中,先获取到实际参数的地址,然后将其复制,并把该地址的拷贝传递给被调函数的形式参数。
因为参数的地址都指向同⼀个对象,所以我们也称之为"传共享对象",所以,如果在被调函数中改变了形式参数的值,调⽤者是可以看到这种变化的。
Java中参数传递
1. 基本数据类型使⽤值传递
2. 对象传递,把对象的引⽤当做值传递给⽅法,即共享对象传递
3. Java对象的传递,是通过复制的⽅式把引⽤关系传递了,如果我们没有改引⽤关系,⽽是找到引⽤的地址,把⾥⾯的内容改了,是会
对调⽤⽅有影响的,因为⼤家指向的是同⼀个共享对象。
4. Java的对象传递,如果是修改引⽤,是不会对原来的对象有任何影响的,但是如果直接修改共享对象的属性的值,是会对原来的对象
有影响的。
java方法传参
java⽅法传参这是⼩弟的第⼀篇博客,写得不好还请看官见谅哈!java 有两种数据类型:基本数据类型(int,short,long,byte,float,double,boolean,char),引⽤数据类型(基本数据类型之外的数组,String,对象等等)。
在⽅法中传参数有两种⽅式:值传递和引⽤传递先看下⾯的⼀个实例。
public class Stu {String name;int age;public String getName() {return name;}public void setName(String name) { = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}}public class Test {protected static void updateStu(Stu stu) {stu.setAge(5);stu.setName("Li");//stu=new Stu();//stu.setAge(5);//stu.setName("Li");//⽤上⾯注释的代码替换掉未注释,修改前后的stu是⼀样的,即3,zhang}protected static void updateStr(String str) {str=new String("update");//str="update";//这两⾏代码效果⼀样}protected static void updateInteger(Integer i) {i=10;}protected static void updateBasic(int i) {i=10;}protected static void updateArray(int[] test) {if(test.length>1)test[0]=10;}protected static void updateCharArray(char[] cs) {cs=new char[3];cs[0]='a';cs[1]='b';cs[2]='c';}public static void main(String[] args){Stu stu=new Stu();stu.setAge(3);stu.setName("Zhang");System.out.println("1-----------当⽅法参数为普通对象");System.out.println("初始值");System.out.println(stu.getAge());System.out.println(stu.getName());updateStu(stu);System.out.println("修改后");System.out.println(stu.getAge());System.out.println(stu.getName());System.out.println("2-----------当⽅法参数为String");String str1=new String("haha");String str2="hehe";System.out.println("初始值");System.out.println(str1);System.out.println(str2);updateStr(str1);updateStr(str2);System.out.println("修改后");System.out.println(str1);System.out.println(str2);System.out.println("3-----------当⽅法参数为Integer");Integer integer=new Integer(5);System.out.println("初始值");System.out.println(integer);updateInteger(integer);System.out.println("修改后");System.out.println(integer);System.out.println("4-----------当⽅法参数为⼋种基本类型");int t=5;System.out.println("初始值");System.out.println(t);updateBasic(t);System.out.println("修改后");System.out.println(t);System.out.println("5-----------当⽅法参数为整数数组");int[] test ={1,2,3};System.out.println("初始值");System.out.println(test[0]+"--"+test[1]+"--"+test[2]); updateArray(test);System.out.println("修改后");System.out.println(test[0]+"--"+test[1]+"--"+test[2]);System.out.println("6-----------当⽅法参数为字符数组");char[] cs ={'1','2','3'};System.out.println("初始值");System.out.println(cs);updateCharArray(cs);System.out.println("修改后");System.out.println(cs);}}=======================================输出1-----------当⽅法参数为普通对象初始值3Zhang修改后5Li2-----------当⽅法参数为String初始值hahahehe修改后hahahehe3-----------当⽅法参数为Integer初始值5修改后54-----------当⽅法参数为⼋种基本类型初始值5修改后55-----------当⽅法参数为整数数组初始值1--2--3修改后10--2--36-----------当⽅法参数为字符数组初始值123修改后123根据上⾯的结果,可以得出这样的结论1、基本数据类型采⽤的是值传递,(类似C⾥⾯的传值),它不会修改实参的值2、引⽤数据类型采⽤的是引⽤传递,(类似C⾥⾯的传指针),和值传递类似,传的是引⽤的⼀份拷贝,⽽⾮引⽤本⾝(通过下⾯的例⼦证实),引⽤可以理解成JAVA的指针,它指向对象在堆⾥⾯分配的⾸地址。
java后端传递给前端参数的方式
在Java后端开发中,传递参数给前端是非常常见的需求。
而传递参数的方式也有多种多样,可以根据具体情况选择合适的方式来实现。
接下来,我将详细探讨Java后端传递参数给前端的方式,并且进行全面评估。
1. URL传参在Java后端开发中,最常见的传递参数的方式之一就是通过URL传参。
通过在URL中添加参数,后端可以将数据传递给前端。
这种方式简单直接,但是对于数据量较大或者对参数安全性要求较高的情况并不适用。
2. 表单提交另一种常见的方式是通过表单提交来传递参数。
前端可以通过表单将数据提交给后端,后端再进行相应的处理并返回结果给前端。
这种方式适用于需要用户交互的场景,但仍然存在数据安全性的问题。
3. AJAX异步请求在现代的Web开发中,利用AJAX进行异步数据交互已经成为主流。
通过AJAX技术,前端可以向后端发起异步请求,后端返回数据,前端再进行相应的处理。
这种方式可以实现页面的局部刷新,提高用户体验,并且可以通过JSON等数据格式保证数据传输的安全性。
4. RESTful API对于复杂的前后端交互场景,可以采用RESTful API来传递参数。
通过定义统一的API接口,前后端可以按照约定的方式进行数据交互,提高开发效率和降低沟通成本。
通过以上评估,我们可以看到不同的场景可以选择不同的方式来传递参数。
对于简单的数据交互,可以选择URL传参或者表单提交;对于复杂的交互场景,可以采用AJAX异步请求或者RESTful API。
选择合适的参数传递方式可以提高开发效率,保证数据安全性。
总结回顾:在Java后端传递参数给前端的过程中,灵活选择合适的方式是至关重要的。
在实际开发中,需要根据具体需求和场景来选择最合适的参数传递方式。
前后端需充分沟通,协商出符合双方需求的参数传递方式。
个人观点:在我看来,RESTful API是当前传递参数给前端的最佳实践。
通过统一的API接口规范,可以更好地定义参数传递方式和数据格式,提高开发效率和降低沟通成本。
Java传参的三种情况
java传值与传引用的三种情况大家先看一个例子: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.print(ex.ch);}public void change(String str,char ch[]){str="test ok";ch[0]='g';}}看看输出结果?good and gbcjava中没有了c++中这样的引用符号,也没像c#中那样提供了out与ref 那么它是怎么做的呢做什么事情都要去除例外的东西,String类就是此类问题的一个特殊情况为什么特殊呢?因为它是一个引用类型,确执行的是值传递。
这样说有些抽象,还是举个例子吧值传递:class Str{public static void main(String[] args){int i = 900;System.out.println(i);changeInt(i);System.Out.println(i);}public static void changeInt(int s){s = 34234;}}结果:900900这就是所谓的值传递。
i把自己的副本给了函数changeInt的形参,而在changeInt中虽然将s赋值34234。
但是对原来的i值并没有影响,因为它所修改的只是i的copy品而已。
引用传递:class Str{public static void main(String[] args){Yinyong y = new Yinyong();System.Out.println(y.age);changeObject(y);System.Out.println(y.age);}public static void changeObject(Yinyong obj){Obj.age = 34234;}}class Yinyong{int age = 22;}声明了个简单的类Yinyong,当把Yinyong的对象y传递给函数changeObject后,看下前后结果:2234234值被改变了,这就是引用调用。
JAVA传参的三种情况
JAVA传参的三种情况Java中传参的方式有三种情况,分别为按值传递、按引用传递和传递对象。
1.按值传递:按值传递是指将实际参数的值复制给形式参数,即在方法调用时,实际参数的值被复制到方法的形式参数中。
这意味着,在方法中对形式参数的修改不会影响实际参数的值。
Java的基本数据类型如int、float、char等都是按值传递的。
下面是一个示例:```javapublic class Mainpublic static void main(String[] args)int num = 10;System.out.println("调用方法前的值:" + num);changeValue(num);System.out.println("调用方法后的值:" + num);}public static void changeValue(int value)value = 20;System.out.println("方法中的值:" + value);}```上述代码输出结果为:```调用方法前的值:10方法中的值:20调用方法后的值:10```从结果可以看出,在方法中修改形式参数的值,并不会影响实际参数的值。
2.按引用传递:按引用传递是指将实际参数的引用复制给形式参数,即在方法调用时,实际参数的引用被复制到方法的形式参数中。
这意味着,在方法中对形式参数的修改会改变实际参数的值。
Java中的非基本数据类型如数组、对象等都是按引用传递的。
下面是一个示例:```javapublic class Mainpublic static void main(String[] args)int[] arr = {1, 2, 3};System.out.println("调用方法前的数组:" +Arrays.toString(arr));changeArray(arr);System.out.println("调用方法后的数组:" +Arrays.toString(arr));}public static void changeArray(int[] array)array[0] = 4;System.out.println("方法中的数组:" +Arrays.toString(array));}```上述代码输出结果为:```调用方法前的数组:[1,2,3]方法中的数组:[4,2,3]调用方法后的数组:[4,2,3]```从结果可以看出,在方法中修改形式参数所引用的数组的值,实际参数的值也会随之改变。
Java方法传参,测试在方法内部改变参数内容是否会影响到原值
Java⽅法传参,测试在⽅法内部改变参数内容是否会影响到原值我分了三种类型的参数进⾏测试⼀、基本类型public static void main(String[] args) {System.out.println("验证基本类型int作为参数传⼊⽅法中进⾏修改后原值是否会改变");int item1 = 1;System.out.println("int:改变前值为" + item1);changeInt(item1);System.out.println("int:类型改变后值为" + item1);System.out.println("-------------------------------------------------------");}private static void changeInt(int param) {param = 10;System.out.println("int:⽅法中值为" + param);}打印结果:这⾥我⽤的是int,基本类型算是⽐较简单明了,传⼊⽅法的参数是int item1的值拷贝,所以⽅法内改变的不是item1。
⼆、引⽤类型public static void main(String[] args) {System.out.println("验证引⽤类型ItemModel作为参数传⼊⽅法中进⾏修改后原值是否会改变");System.out.println("第⼀次测试");ItemModel item4 = new ItemModel("xiao ming");System.out.println("ItemModel:改变前对象的hashCode为" + System.identityHashCode(item4) + " 值为" + item4.toString());changeItemModel1(item4);System.out.println("ItemModel:改变后对象的hashCode为" + System.identityHashCode(item4) + " 值为" + item4.toString());System.out.println("第⼆次测试");ItemModel item5 = new ItemModel("xiao ming");System.out.println("ItemModel:改变前对象的hashCode为" + System.identityHashCode(item5) + " 值为" + item5.toString());changeItemModel2(item5);System.out.println("ItemModel:改变后对象的hashCode为" + System.identityHashCode(item5) + " 值为" + item5.toString());System.out.println("-------------------------------------------------------");}private static void changeItemModel1(ItemModel param) {param.setName("xiao hong");System.out.println("ItemModel:⽅法中对象的hashCode为" + System.identityHashCode(param) + " 值为" + param);}private static void changeItemModel2(ItemModel param) {param = new ItemModel();param.setName("xiao hong");System.out.println("ItemModel:⽅法中对象的hashCode为" + System.identityHashCode(param) + " 值为" + param);}class ItemModel {private String name;public ItemModel() {}ItemModel(String name) { = name;}public String getName() {return name;}public void setName(String name) { = name;}@Overridepublic String toString() {return "ItemModel{" +"name='" + name + '\'' +'}';}}打印结果:这⾥我打印了ItemModel的hashCode和toString⽅法,我们可以看到在第⼀次测试中,改变前、⽅法中、改变后对象的hashCode的是⼀样的,所以我们可以确认传⼊⽅法的是对象的引⽤,所以这⼀次原对象发⽣改变。
java 传递方法参数
java 传递方法参数传递方法参数是Java编程中一项常见的操作,它在方法调用过程中起到了重要的作用。
通过传递方法参数,我们可以向方法中传递数据或者对象,使得方法能够接收并处理这些数据,从而实现特定的功能。
在Java中,传递方法参数有两种方式:值传递和引用传递。
值传递是指将实际参数的值复制一份传递给方法,在方法内部对参数的修改不会影响到实际参数的值。
而引用传递则是指将实际参数的地址传递给方法,方法内部对参数的修改会影响到实际参数的值。
在使用值传递时,我们可以将基本类型的数据作为参数传递给方法。
例如,我们可以将一个整数、一个浮点数或者一个布尔值作为参数传递给方法,并在方法内部对其进行处理。
值传递的特点是方法内部对参数的修改不会影响到方法外部的变量。
另一种方式是引用传递,它适用于传递对象作为参数的情况。
在Java中,对象是通过引用来传递的,传递的是对象的地址。
当我们将一个对象作为参数传递给方法时,方法内部可以通过引用修改对象的属性或者调用对象的方法。
这种传递方式能够使方法具有更大的灵活性,可以对对象进行更复杂的操作。
在实际编程中,我们通常会使用值传递和引用传递的组合来完成复杂的任务。
通过值传递,我们可以传递基本类型的数据,并在方法内部对其进行处理;通过引用传递,我们可以传递对象,并在方法内部对对象进行操作。
除了传递参数的方式,我们还可以在方法定义时指定参数的类型和个数。
在Java中,方法的参数可以是基本类型或者对象类型,并且可以有多个参数。
通过指定参数的类型和个数,我们可以更准确地传递参数,并确保方法的正确执行。
传递方法参数的方式和方法的定义有着密切的关系。
在调用方法时,我们需要根据方法的定义来传递参数,并确保参数的类型和个数与方法的定义相匹配。
如果参数的类型和个数不匹配,编译器将会报错,提示我们进行修改。
在实际编程中,我们经常会使用方法来完成特定的任务,尤其是在面向对象的程序设计中。
通过传递方法参数,我们可以将数据或者对象传递给方法,并在方法内部对其进行操作。
java方法间传参
java方法间传参Java是一种面向对象的编程语言,方法是Java程序的基本组成单元之一。
在Java中,方法间传参是实现不同方法之间数据交流的一种重要机制。
本文将介绍Java方法间传参的相关知识,并探讨其在实际开发中的应用。
一、方法间传参的概念和作用在Java中,方法间传参指的是在不同方法之间传递数据或对象。
通过传参,可以将数据或对象从一个方法传递到另一个方法,实现方法之间的数据交流和共享。
这在实际开发中非常常见,可以提高代码的复用性和可维护性。
二、方法间传参的方式Java方法间传参可以通过值传递和引用传递两种方式实现。
1. 值传递值传递是指将实参的值复制一份传递给形参。
在方法内部修改形参的值不会影响实参的值。
这种方式适用于传递基本数据类型,如int、float等。
2. 引用传递引用传递是指将实参的引用传递给形参,形参和实参指向同一个对象。
在方法内部修改形参的值会影响实参的值。
这种方式适用于传递对象类型,如数组、字符串等。
三、方法间传参的注意事项在方法间传参时,需要注意以下几点:1. 参数类型要匹配传递的参数类型要与方法定义时的参数类型保持一致,否则会导致编译错误。
2. 参数个数要一致传递的参数个数要与方法定义时的参数个数保持一致,否则会导致编译错误。
3. 方法调用要正确在方法调用时,需要传递正确的参数,否则会导致运行时错误。
四、方法间传参的实际应用方法间传参在实际开发中应用广泛,以下是几个常见的应用场景:1. 方法返回值传参有时候需要将一个方法的返回值作为另一个方法的参数,可以通过方法间传参实现。
这样可以避免重复计算和提高代码的复用性。
2. 对象属性传参在一个方法中修改了一个对象的属性值,可以将该对象传递给另一个方法,实现属性值的共享和传递。
3. 数组传参数组是一种常见的数据结构,通过将数组作为参数传递给方法,可以实现对数组元素的操作和修改。
4. 字符串传参字符串是一种常用的数据类型,通过将字符串作为参数传递给方法,可以实现对字符串的处理和操作。
Java中的参数传递方式·
Java中的参数传递⽅式· Java的参数传递⽅式在编程中,往⽅法中传递参数的⽅法往往有两种,⼀种是值传递,⼀种是引⽤传递,⽽在java中,所有的参数传递全部都是值传递。
但是实际使⽤中往往会出现⼀些类似引⽤传递的⽅式,下⾯我将⼀⼀举例说明。
⾸先,java中的所有的对象都是通过“引⽤”操作的。
java中有五个不同的地⽅可以储存对象。
1)寄存器:这是最快的储存区域,但是这个区域并不能由⽤户直接控制,⽤户也感觉不到寄存器的存在。
2)堆栈:位于通⽤RAM中,通过堆栈指针可以获得直接⽀持。
Java的对象引⽤及储存在堆栈之中,但是java对象并不储存在堆栈中。
3)堆:⼀种通⽤的内存池,也存在于RAM中,⽤于存放所有的java对象,通过new关键字创建的对象都会存在于堆中。
4)常量储存:常量值通常直接存在于程序代码内部,并存放在ROM(只读存储器)中。
5)⾮RAM储存:存活于程序之外的数据。
1.传递基本类型数据。
java中的基本类型数据即 int,char这⼀类。
测试代码如下:1package com.csust.wk;2public class FunctionTest1 {3public static void change(int b){4 b = 10;5 }67public static void main(String[] args) {8int i = 5;9 System.out.println(i);10 change(i);11 System.out.println(i);12 }13 }程序输出:55由结果可见,传⼊change()⽅法中的变量并没有被改变。
结果分析: 在基本类型int创建的过程中,如int a = 5; java⾸先会在堆栈中(所有基本类型的创建和保存都是在堆栈中进⾏的操作)查询有没有5这个值,如果没有则会在堆栈中开辟⼀个新的内存空间同时将5置⼊该空间。
然后a这个引⽤就指向了5所在的内存空间。
java前端与后端参数传递方法小结
一、概述Java作为一种广泛应用的编程语言,其在前端与后端参数传递方面有多种方法,本文将对Java前端与后端参数传递方法进行小结,以便于读者更好地理解和应用这些技术。
二、URL参数传递1. URL参数传递是前端与后端参数传递中最常见的一种方式。
2. 前端通过URL拼接参数,后端通过request.getParameter()方法获取参数值。
3. 优点:简单易用,适用于简单的参数传递场景。
4. 缺点:参数暴露在URL中,安全性较差,且对于传递大量参数不够方便。
三、表单提交1. 在表单提交时,前端通过form表单将参数传递给后端。
2. 后端通过request.getParameter()方法获取表单中的参数值。
3. 优点:适用于传递复杂数据结构,支持文件上传等场景。
4. 缺点:相比URL参数传递,表单提交需要页面跳转,用户体验稍差。
四、Ajax异步传输1. 前端通过Ajax技术将参数异步传输给后端。
2. 后端通过request.getInputStream()方法获取前端传递的参数。
3. 优点:无需页面跳转,用户体验好,支持大规模数据传输。
4. 缺点:需要一定的前端编程技巧,对于初学者来说较为复杂。
五、RESTful API1. RESTful API是一种基于REST架构风格的接口设计,前端通过HTTP请求将参数传递给后端。
2. 后端通过PathVariable、RequestParam等注解获取前端传递的参数。
3. 优点:接口简洁清晰,易于理解和维护。
4. 缺点:需要遵循一定的接口设计规范,对于初学者来说学习成本较高。
六、Websocket传输1. Websocket是一种全双工通信协议,前后端可以通过它进行实时的参数传输。
2. 前端通过Websocket与后端建立连接,并通过发送消息的方式传递参数。
3. 后端通过onMessage()等方法接收前端发送的参数。
4. 优点:支持实时通信和大规模数据传输。
java_函数参数传入不同对象的方法
java 函数参数传入不同对象的方法1. 引言1.1 概述引言部分旨在介绍本篇文章的主题和背景,以概括性语句为开头,引导读者对主题建立初步认知。
Java作为一种面向对象编程语言,在函数参数传递方面提供了多样的方式。
本文将探讨不同对象类型作为方法参数时的特点与应用。
通过对这一重要主题的深入研究,我们可以更全面地理解Java中函数参数传递的机制,从而提高代码效率和可维护性。
1.2 文章结构接下来,我们将简要介绍一下本文的结构安排,使读者能够更好地理解本文内容并快速获取所需信息。
文章主要分为五个部分:第一部分是引言部分,本部分将对文章进行整体介绍和概述,以及列出章节目录。
第二部分将探讨不同对象类型作为方法参数时的特点,并介绍方法参数的类型分类。
第三部分将通过实例进行具体案例分析,包括基本数据类型和对象类型作为方法参数的情况,并探讨多态和继承下的方法参数传递特点。
第四部分则会介绍在参数传递过程中需要注意的事项和技巧,如避免过度使用方法参数、使用可变长度参数进行灵活传参以及将对象封装成类来统一管理复杂方法参数组合场景等。
最后一部分为结论部分,主要对文中的观点和结论进行总结,并提出进一步研究或可行性建议。
1.3 目的本文旨在帮助读者更好地理解Java中不同对象类型作为方法参数时的特点和应用。
通过对函数参数传递机制的深入探讨,读者可以在实际编码过程中更加灵活地运用各种方法参数传递方式,并且针对不同需求选择合适的方式,以提高代码质量和效率。
接下来我们将从第二部分开始详细讨论不同对象类型作为方法参数的情况,并探索它们的特点和应用。
2. 不同对象的方法参数传递2.1 方法参数的类型在Java中,方法参数可以是基本数据类型或者是对象类型。
基本数据类型包括整型、浮点型、字符型、布尔型等,而对象类型则包括类、接口和数组。
2.2 值传递和引用传递在Java中,方法的参数传递方式有两种:值传递和引用传递。
值传递是指将实际参数的值复制一份,然后将这个副本传递给方法,在方法内部对该副本进行操作,并不会影响到原始的实际参数。
java方法中参数的传递问题
java方法中参数的传递问题在Java中,参数的传递是通过值传递进行的。
这意味着当你将一个变量作为参数传递给一个方法时,Java实际上是传递了这个变量的值,而不是变量本身。
因此,如果你在方法内部修改了这个值,原始变量的值不会被改变。
这就是Java的按值传递参数的机制。
例如:javapublic class Test {public static void main(String[] args) {int x = 10;change(x);System.out.println(x); // 输出:10}public static void change(int x) {x = 20;}}在这个例子中,我们创建了一个名为x的变量,并将其值设置为10。
然后,我们将x作为参数传递给change方法。
在change方法内部,我们改变了x的值(将其设置为20)。
然而,当我们在main方法中再次打印x的值时,我们看到它的值仍然是10,而不是20。
这是因为Java传递的是x的值,而不是x本身。
因此,对x的任何改变不会影响原始的x。
但是,对于对象引用类型的参数,情况就有所不同了。
当你将对象引用作为参数传递给方法时,实际上是传递了这个对象的引用。
因此,如果你在方法内部修改了这个对象,原始对象的值将会被改变。
例如:javapublic class Test {public static void main(String[] args) {Person person = new Person("Alice");change(person);System.out.println(person.getName()); // 输出:"Bob"}public static void change(Person person) {person.setName("Bob");}}。
Java方法的参数传递
actualParameter.temp); fun(actualParameter);//引用变量作为实参 System.out.println("fun() 调 用 后 实 参 actualParameter 的 值 : " +
actualParameter.temp); } public static void fun(Demo formalParameter) { //引用变量作为形参 formalParameter.temp = 888; }
Java 方法的参数传递(二)——非“不可变对象”的引用变量作为参数
FFEA
10
a=10;
可见,在“按值传递”过程中,无论形参如何变化,对应的实参都能“毫发无损”,因 为形参得到的只是实参值的复制品。实参给了形参这个“复制品”后,就全身而退,让形参 自个儿去玩。
★ C 语言中的“按地址传递”(适用于指针变量) /*定义函数 func */ func(int *a) { *a=10; /*让形参 a 指向的存储区存放值为 10 */ }
FFEA
FFE0
FFE0
5
func(&b); /*调用函数 func,实参 b 的实参地址 FFF0 赋给形参 a*/
Java 方法的参数传递(二)——非“不可变对象”的引用变量作为参数
FFEA
FFE0
java 引用传参
在 Java 中,方法参数的传递方式有两种:值传递和引用传递。 对于基本数据类型(如 int、float 等),使用的是值传递。而对于 对象类型,使用的是引用传递。 值传递:在值传递中,将实际参数的副本传递给方法的形式参数。这 意味着,修改方法内的形式参数不会影响到实际参数的值。例如:
javaCopy Code
public static void modifyValue(int value) { value = 100;
}
public static void main(String[] args) { int x = 10; modifyValue(x); System.out.println(x); // 输出为 10,原始变量并未被修改
person 对象的 name 属性被修改 }
在上述示例中,通过引用传递将 person 对象的引用传递给 changeName 方法,所以对形式参数 person 的修改会反映在实际参数 person 所引用的对象上。
需要注意的是,虽然在引用传递中,方法内对对象属性的修改会影响 实际参数所引用的对象,但是如果在方法内对形式参数进行重新赋 值,实际参数并不会受到影响。这是因为重新赋值会改变形式参数的 引用,使其指向新的对象。
} }
public static void changeName(Person person) { = "John";
}
public static void main(String[] args) { Person person = new Person("Alice"); changeName(person); System.out.println(); // 输 出 为 "John" ,
java函数参数传递方式
java函数参数传递方式
在Java中,函数参数传递方式有两种:值传递和引用传递。
一、值传递
值传递是指在函数调用时,将实际参数的值传递给形式参数,此时实际参数的值不会受到形式参数的影响。
在函数内部修改形式参数的值并不影响实际参数的值,因为形式参数和实际参数是两个不同的变量,它们所占用的内存空间也不同。
例如:
以上代码中,swap函数并没有改变实际参数a和b的值,输出结果为a=10,b=20。
因为在函数swap中,形式参数x和y是两个新的变量,它们的值是由实际参数a和b复制而来的,因此在函数swap中交换x和y的值不会对a和b产生任何影响。
二、引用传递
以上代码中,change函数通过引用传递修改了实际参数arr的值,输出结果为[2, 4, 6]。
因为在函数change中,形式参数arr和实际参数arr指向同一个数组对象,函数change对形式参数arr的操作将直接影响到实际参数arr。
三、小结
引用传递是指将实际参数的地址传递给形式参数,形式参数和实际参数指向同一个对象,对形式参数的操作将影响到实际参数。
java中参数传递方式详解
java中参数传递⽅式详解java中参数传递⽅式详解java新⼿⼊门⾯临的⼀个经典的话题,本⽂意在终结这个话题,java中有说法:Java⾥⾯参数传递都是按值传递,怎么理解这句话?⽤⽂字说明恐怕不容易说明⽩,说明⽩恐怕也难以想明⽩。
前提先明确⼀下,按值还是按引⽤的概念,它是来⾃c++语⾔,引⽤不是汉语词典中的⼀个词,⽽是c++的概念——“&”这个符号还记得吧?为什么有这个话题呢?其⼀,是对按引⽤传递理解不透彻;其⼆,诸多java书籍及讨论论点并没有切中要害。
⼀句话概括,按值传参还是按引⽤传参,既然是参数传递⽅式,那么只针对形参和实参,这⾥说的是参数本⾝,不是参数对象的⼦对象或孙⼦对象。
有了前提,上c++代码:#include <iostream>using namespace std;class User{private:int m_id;public:User(int id=0){m_id = id;}void setId(int id){m_id = id;}int getId(){return m_id;}};void test0(User t){//按值传参User s;t = s;t.setId(1002);cout << "test1:" << t.getId() << endl;}void test1(User *t){//按值传参t = new User();//指针指向了⼀个新对象,外⾯实参没变t->setId(1002);cout << "test1:" << t->getId() << endl;}void test2(User* & t){//按引⽤传参t = new User();//指针指向了⼀个新对象,外⾯实参也跟着变了t->setId(1002);cout << "test2:" << t->getId() << endl;}int main(int argc, char const *argv[]) {cout<< "\npass by ref:"<<endl;User* t = new User();t->setId(1001);cout << t->getId() << endl;test2(t);cout << t->getId() << endl;cout<< "\npass by value:"<<endl;t = new User();t->setId(1001);cout << t->getId() << endl;test1(t);cout << t->getId() << endl;return 0;}输出结果:pass by ref:1001test2:10021002pass by value:1001test1:10021001c++⼩结:按值传递,那么在函数内修改了形参指向⼀个新对象,外⾯的实参不受影响。
java 基本类型传参
java 基本类型传参全文共四篇示例,供读者参考第一篇示例:Java 中的基本类型传参是指在方法调用中传递基本数据类型的值。
Java 的基本数据类型包括整型、浮点型、字符型、布尔型等,这些数据类型在内存中按照固定的大小存储,并且直接存储了数据的值。
在Java 中,基本类型的传参有两种方式:按值传递和按引用传递。
下面我们将详细介绍这两种方式。
1. 按值传递在Java 中,基本数据类型的传参是按值传递的。
这意味着在方法调用时,传递的是实际的数值,而不是变量本身。
当我们将一个基本类型的变量作为参数传递给一个方法时,实际上是将其值复制一份传递给方法内部。
例如:public static void changeValue(int val) {val = 20;}}```class Person {private String name;需要注意的是,尽管Java 中的对象是通过引用传递的,但实际上仍然是按值传递的。
也就是说,传递给方法的是对象的引用的副本,而不是对象本身。
总结一下,在Java 中基本数据类型的传参是按值传递的,而对象是通过引用传递的。
了解这两种传参方式有助于我们更好地理解Java 中的方法调用机制。
第二篇示例:Java是一门广泛使用的编程语言,其基本类型传参在开发过程中扮演着非常重要的角色。
基本类型传参指的是将基本数据类型作为参数传递给方法或函数。
在Java中,基本类型包括整型(byte、short、int、long)、浮点型(float、double)、字符型(char)和布尔型(boolean)。
基本类型传参有两种方式:按值传递和按引用传递。
在Java中,基本类型传参是按值传递的,这意味着方法得到的是参数变量的一个拷贝,而不是参数变量本身。
这一点和按引用传递有所不同,按引用传递是传递的是指向变量内存地址的引用。
在Java中,基本类型传参的特点包括:1. 传递的是值的拷贝:当把一个基本类型的变量传递给方法时,方法得到的是这个变量的一个拷贝,对拷贝的操作不会影响原变量的值。
Java多线程:向线程传递参数的三种方法
Java多线程:向线程传递参数的三种⽅法在传统的同步开发模式下,当我们调⽤⼀个函数时,通过这个函数的参数将数据传⼊,并通过这个函数的返回值来返回最终的计算结果。
但在多线程的异步开发模式下,数据的传递和返回和同步开发模式有很⼤的区别。
由于线程的运⾏和结束是不可预料的,因此,在传递和返回数据时就⽆法象函数⼀样通过函数参数和return语句来返回数据。
本⽂就以上原因介绍了⼏种⽤于向线程传递数据的⽅法,在下⼀篇⽂章中将介绍从线程中返回数据的⽅法。
欲先取之,必先予之。
⼀般在使⽤线程时都需要有⼀些初始化数据,然后线程利⽤这些数据进⾏加⼯处理,并返回结果。
在这个过程中最先要做的就是向线程中传递数据。
⼀、通过构造⽅法传递数据在创建线程时,必须要建⽴⼀个Thread类的或其⼦类的实例。
因此,我们不难想到在调⽤start⽅法之前通过线程类的构造⽅法将数据传⼊线程。
并将传⼊的数据使⽤类变量保存起来,以便线程使⽤(其实就是在run⽅法中使⽤)。
下⾯的代码演⽰了如何通过构造⽅法来传递数据:1. package mythread;2.3. public class MyThread1 extends Thread4. {5. private String name;6.7. public MyThread1(String name)8. {9. = name;10. }11. public void run()12. {13. System.out.println("hello " + name);14. }15. public static void main(String[] args)16. {17. Thread thread = new MyThread1("world");18. thread.start();19. }20. }由于这种⽅法是在创建线程对象的同时传递数据的,因此,在线程运⾏之前这些数据就就已经到位了,这样就不会造成数据在线程运⾏后才传⼊的现象。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
java传值与传引用的三种情况大家先看一个例子: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.print(ex.ch);}public void change(String str,char ch[]){str="test ok";ch[0]='g';}}看看输出结果? good and gbcjava中没有了c++中这样的引用符号,也没像c#中那样提供了out与ref 那么它是怎么做的呢做什么事情都要去除例外的东西,String类就是此类问题的一个特殊情况为什么特殊呢?因为它是一个引用类型,确执行的是值传递。
这样说有些抽象,还是举个例子吧值传递:class Str{public static void main(String[] args){int i = 900;System.out.println(i);changeInt(i);System.Out.println(i);}public static void changeInt(int s){s = 34234;}}结果:900900这就是所谓的值传递。
i把自己的副本给了函数changeInt的形参,而在changeInt中虽然将s赋值34234。
但是对原来的i值并没有影响,因为它所修改的只是i的copy品而已。
引用传递:class Str{public static void main(String[] args){Yinyong y = new Yinyong();System.Out.println(y.age);changeObject(y);System.Out.println(y.age);}public static void changeObject(Yinyong obj){Obj.age = 34234;}}class Yinyong{int age = 22;}声明了个简单的类Yinyong,当把Yinyong的对象y传递给函数changeObject后,看下前后结果:2234234值被改变了,这就是引用调用。
下面再看看传递String对象会发生什么结果?class Str{public static void main(String[] args){String s = "java test";System.Out.println(s);changeString(s);System.out.println(s);}public static void changeString(String str){str = "3gg over right";}}看看结果吧:java testjava test你惊奇的发现s的值并没有改变!你会问了,String不也是引用类型的吗?怎么它的值没有改变呢?因为是这样的:String被设计为不可修改的类型,也就是对String对象的任何修改都将重新创建一个对象而放弃以前的内存空间的引用!如上例:比如 s指向0x2344,当它赋值给str时str也同样指向了0x2344。
而当执行str="3gg over right"后,str指向了别的地方。
也许是0x2222或者其他,反正不是0x2344了。
所以当你输出s的时候,它的值并没有被修改!综上所述:基本数据类型传递的是值的拷贝;对象类型传递的是引用的拷贝;而String类型传递的虽然也是对象,但它不同于一般的对象类型,它String 被设计为不可修改的类型,也就是对String对象的任何修改都将重新创建一个对象而放弃以前的内存空间的引用!按值传递还是按引用传递这个在Java里面是经常被提起的问题,也有一些争论,似乎最后还有一个所谓的结论:“在Java里面参数传递都是按值传递”。
事实上,这很容易让人迷惑,下面先分别看看什么是按值传递,什么是按引用传递,只要能正确理解,至于称作按什么传递就不是个大问题了。
1:按值传递是什么指的是在方法调用时,传递的参数是按值的拷贝传递。
示例如下:public class TempTest {private void test1(int a){//做点事情}public static void main(String[] args) {TempTest t = new TempTest();int a = 3;t.test1(a);//这里传递的参数a就是按值传递}}按值传递重要特点:传递的是值的拷贝,也就是说传递后就互不相关了。
示例如下:public class TempTest {private void test1(int a){a = 5;System.out.println("test1方法中的a==="+a);}public static void main(String[] args) {TempTest t = new TempTest();int a = 3;t.test1(a);//传递后,test1方法对变量值的改变不影响这里的aSystem.out.println(”main方法中的a===”+a);}}运行结果是:test1方法中的a===5main方法中的a===32:按引用传递是什么指的是在方法调用时,传递的参数是按引用进行传递,其实传递的引用的地址,也就是变量所对应的内存空间的地址。
示例如下:public class TempTest {private void test1(A a){}public static void main(String[] args) {TempTest t = new TempTest();A a = new A();t.test1(a); //这里传递的参数a就是按引用传递}}class A{public int age = 0;}3:按引用传递的重要特点传递的是值的引用,也就是说传递前和传递后都指向同一个引用(也就是同一个内存空间)。
示例如下:第1行 public class TempTest {第2行 private void test1(A a){第3行 a.age = 20;第4行 System.out.println("test1方法中的age="+a.age);第5行 }第6行 public static void main(String[] args) {第7行 TempTest t = new TempTest();第8行 A a = new A();第9行 a.age = 10;第10行 t.test1(a);第11行System.out.println(”main方法中的age=”+a.age);第12行 }第13行 }第14行 class A{第15行 public int age = 0;第16行 }运行结果如下:test1方法中的age=20main方法中的age=204:理解按引用传递的过程——内存分配示意图要想正确理解按引用传递的过程,就必须学会理解内存分配的过程,内存分配示意图可以辅助我们去理解这个过程。
用上面的例子来进行分析:(1):运行开始,运行第8行,创建了一个A的实例,内存分配示意如下:(2):运行第9行,是修改A实例里面的age的值,运行后内存分配示意如下:(3):运行第10行,是把main方法中的变量a所引用的内存空间地址,按引用传递给test1方法中的a变量。
请注意:这两个a变量是完全不同的,不要被名称相同所蒙蔽。
内存分配示意如下:由于是按引用传递,也就是传递的是内存空间的地址,所以传递完成后形成的新的内存示意图如下:也就是说:是两个变量都指向同一个空间。
(4):运行第3行,为test1方法中的变量a指向的A实例的age进行赋值,完成后形成的新的内存示意图如下:此时A实例的age值的变化是由test1方法引起的(5):运行第4行,根据此时的内存示意图,输出test1方法中的age=20 (6):运行第11行,根据此时的内存示意图,输出main方法中的age=205:对上述例子的改变理解了上面的例子,可能有人会问,那么能不能让按照引用传递的值,相互不影响呢?就是test1方法里面的修改不影响到main方法里面呢?方法是在test1方法里面新new一个实例就可以了。
改变成下面的例子,其中第3行为新加的:第1行 public class TempTest {第2行 private void test1(A a){第3行 a = new A();//新加的一行第4行 a.age = 20;第5行 System.out.println("test1方法中的age="+a.age);第6行 }第7行 public static void main(String[] args) {第8行 TempTest t = new TempTest();第9行 A a = new A();第10行 a.age = 10;第11行 t.test1(a);第12行System.out.println(”main方法中的age=”+a.age);第13行 }第14行}第15行class A{第16行 public int age = 0;第17行}运行结果为:test1方法中的age=20main方法中的age=10为什么这次的运行结果和前面的例子不一样呢,还是使用内存示意图来理解一下6:再次理解按引用传递(1):运行开始,运行第9行,创建了一个A的实例,内存分配示意如下:(2):运行第10行,是修改A实例里面的age的值,运行后内存分配示意如下:(3):运行第11行,是把main方法中的变量a所引用的内存空间地址,按引用传递给test1方法中的a变量。
请注意:这两个a变量是完全不同的,不要被名称相同所蒙蔽。
内存分配示意如下:由于是按引用传递,也就是传递的是内存空间的地址,所以传递完成后形成的新的内存示意图如下:也就是说:是两个变量都指向同一个空间。
(4):运行第3行,为test1方法中的变量a重新生成了新的A实例的,完成后形成的新的内存示意图如下:(5):运行第4行,为test1方法中的变量a指向的新的A实例的age进行赋值,完成后形成的新的内存示意图如下:注意:这个时候test1方法中的变量a的age被改变,而main方法中的是没有改变的。