什么是java的值传递 java 类之间数值的传递
老铁们,大家好,相信还有很多朋友对于什么是java的值传递和java 类之间数值的传递的相关问题不太懂,没关系,今天就由我来为大家分享分享什么是java的值传递以及java 类之间数值的传递的问题,文章篇幅可能偏长,希望可以帮助到大家,下面一起来看看吧!
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方法对变量值的改变不影响这里的a System.out.println(”main方法中的a===”+a);}}运行结果是: test1方法中的a===5 main方法中的a===3 2:按引用传递是什么指的是在方法调用时,传递的参数是按引用进行传递,其实传递的引用的地址,也就是变量所对应的内存空间的地址。示例如下: 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=20 main方法中的age=20 4:理解按引用传递的过程??内存分配示意图要想正确理解按引用传递的过程,就必须学会理解内存分配的过程,内存分配示意图可以辅助我们去理解这个过程。用上面的例子来进行分析:(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=20 5:对上述例子的改变理解了上面的例子,可能有人会问,那么能不能让按照引用传递的值,相互不影响呢?就是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=20 main方法中的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方法中的是没有改变的。(6):运行第5行,根据此时的内存示意图,输出test1方法中的age=20(7):运行第12行,根据此时的内存示意图,输出main方法中的age=10 7:
说明(1):“在Java里面参数传递都是按值传递”这句话的意思是:按值传递是传递的值的拷贝,按引用传递其实传递的是引用的地址值,所以统称按值传递。
java值传递和地址传递
JAVA传递参数有两种方式:值传递和引用传递
值传递是传递数据:如基本数据类型都是值传递
引用传递是把形参和实参的指针指向了堆中的同一对象,对象的引用和数组的引用。
实参,Java的基本数据类型,如int,double等在函数的参数传递时,传递的是副本。String也属于这一范畴。
形参,而如果是对象,则传递的是引用。
如下代码实例:
publicclassMainActivityextendsActivity{
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
personp=newperson();
p.name="ken";
p.age="12";
reset(p);//传递的是p的指针地址,方法里面在对p的属性进行修改,方法结束后影响依然存在。
Stringname=p.name;
Stringage=p.age;
System.out.println(name+age);
//name=gg,age=223
setContentView(R.layout.main);
}
privatevoidreset(personap){
ap.name="gg";
ap.age="223";
}
classperson{
Stringname;
Stringage;
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicStringgetAge(){
returnage;
}
publicvoidsetAge(Stringage){
this.age=age;
}
}
java 类之间数值的传递
Java语言中方法间的数据传递方法
方法是数据加工处理或相应操作的基本模块,为了实现某种需求而调用一个方法,需要为被调用的方法传递数据,以便于被调用的方法依据所提供的数据进行相应的操作。
C++语言的函数间的数据传递可以分为:数值传递、地址传递和引用传递。地址传递的形参是同类型的指针,由于指针操作的不安全等问题,Java语言屏弃了指针,故Java语言方法之间的数据传递只有数值传递和引用传递。
1方法间的数值传递
所谓的数值传递又称为值传递,数值传递的特征是:调用方法的实参可以是常量、变量或者是表达式,形参则是对应数据类型的变量。如果实参是变量,则实参
和形参是相互独立的两个单元。在方法调用的过程中,实参的值将拷贝到形参中,此后形参的任何修改都不会影响实参。数值传递方法见例1。
[例1]数值传递调用方法举例:
importjava.io.*;
public class ValueTransmit
{publicstatic void main(Stringargs[])
{intx=5,y=66;
System.out.println(“在主方法,交换前的:x=”+x+“,y=”+y);
swap(x,y);
System.out.println(“在主方法,交换后的:x=”+x+“,y=”+y);
}
static voidswap(int x,int y)
{int temp;
System.out.println(“在swap方法未交换时:x=”+x+“,y=”+y);
temp=x;x=y;y=temp;
System.out.println(“在swap方法交换之后:x=”+x+“,y=”+y);
}
}
例1程序的输出结果如下所示:
在主方法,交换前的:x=5,y=66
在swap方法未交换时:x=5,y=66
在swap方法交换之后:x=66,y=5
在主方法,交换前的:x=5,y=66
在例1程序中,方法调用的“swap(x,y);”中的实在参数x,y是两个单元,而形式参数中的x,y又是两个单元,它们是互相独立的。所以,对形式参数的改变并不影响实在参数的内容;程序的运行结果也验证上述观点。
2方法间的引用传递
方法之间的数据传递还有一种方法,就是引用传递。引用传递的实质就是将实在参数的地址传递给形式参数引用,也就是形式参数是实在参数的别名。
如果你还想了解更多这方面的信息,记得收藏关注本站。