Java中按值传递与按引用传递的区别
值传递:(形式参数类型是基本数据类型):方法调用时,实际参数把它的值传递给对应的形式参数,形式参数只是用实际参数的值初始化自己的存储单元内容,是两个不同的存储单元,所以方法执行中形式参数值的改变不影响实际参数的值。
引用传递:(形式参数类型是引用数据类型参数):也称为传地址。方法调用时,实际参数是对象(或数组),这时实际参数与形式参数指向同一个地址,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,这个结果在方法结束后被保留了下来,所以方法执行中形式参数的改变将会影响实际参数。

//按值传递
public class shiyan {
//先创建一个更改变量的函数,并加上了打印的函数用于比较
public void change(int c){
c=c*5;
System.out.println(c);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int p=5; //先声明一个变量p=5
shiyan c=new shiyan(); //创建对象c
//利用c的成员函数改变p值,使p=p*5
c.change(p);
//输出的是理想值25
System.out.print(p);
//奇怪输出的是5
}
}
输出结果:25 5
分析:这就是按值传递的效果,因为此时传入的不是p本身,只是p的值,传递的是p本身的是副本。
所以打印出的是(p副本的值)的改变结果25,而后一个打印出的是p的真身没有改变过因此是5
//按引用传递
package yinyong;
//先定义一个学生类
public class Student {
//设计重载构造函数,为了后面的演示方便
public Student(){ }
//用于取名的构造函数
public Student(String p){
name=p;
}
//用于改名的的函数,不过得改成别人的名字
public void changName(Student p){
this.name=p.name;
} public String name; }
package yinyong;
public class teacher {
public static void main(String[] args) {
// TODO Auto-generated method stub
//创建a这个人给a学生取名李明
Student a=new Student("李明");
//创建b这个人给b学生取名赵明
Student b=new Student("赵明");
//创建c这个人,还未起名
Student c=new Student();
//分别输出a,b两个人的名字
System.out.println("a同学名字是"+a.name);
System.out.println("b同学名字是"+b.name);
//将c人的名字指向b,实质是将b的地址赋给c,这样c,b同指一片内存区域
c=b;
System.out.println("c同学名字是"+c.name);
//果然c的名字变为了赵明
b.changName(a);
//利用改名函数改变b的名字,将a对象传入将a的名字赋给b
System.out.println("b同学名字是"+b.name);
//结果是a的名字李明
}
}
输出:a同学名字是李明
b同学名字是赵明
c同学名字是赵明
b同学名字是李明
分析: 由于是按引用调用所以,传递的时候时刻都是把对象的真身传递过去,并且可以改变真身的属性和方法。传递时时候也把真身的地址传了过去,这样引用时就指向了同一片地址内存空间。
Java中按值传递与按引用传递的区别的更多相关文章
- 关于Java中按值传递和按引用传递的问题详解
写了两个方法,一个是多关键字的快速排序,一个是基于多关键字的基速排序.两个方法的参数列表是一样一样的,但是快速排序正常工作,但是基数排序传出来的参数一点没有改变,苦思冥想了半天也没想通是怎么回事,于是 ...
- Java的按值传递和按引用传递解说
在网上看到的一个帖子解释Java的按值传递和按引用传递,感觉挺全面,就转过来,以供以后学习参考: 1:按值传递是什么 指的是在方法调用时,传递的参数是按值的拷贝传递.示例如下: public clas ...
- Java中Set Map List 的区别
java中set map list的区别: 都是集合接口 简要说明 set --其中的值不允许重复,无序的数据结构 list --其中的值允许重复,因为其为有序的数据结构 map--成对的数据结构 ...
- Java中Comparable和Comparator接口区别分析
Java中Comparable和Comparator接口区别分析 来源:码农网 | 时间:2015-03-16 10:25:20 | 阅读数:8902 [导读] 本文要来详细分析一下Java中Comp ...
- 转:Java中abstract和interface的区别
转自:Java中abstract和interface的区别 abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java ...
- Java中this与super的区别【6】
若有不正之处,请多多谅解并欢迎批评指正,不甚感激.请尊重作者劳动成果: 本文原创作者:pipi-changing本文原创出处:http://www.cnblogs.com/pipi-changing/ ...
- Java中堆和栈的区别(转)
栈与堆都是Java用来在Ram中存放数据的地方.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆. Java的堆是一个运行时数据区,类的对象从中分配空间.这些对象通过new. ...
- 转:二十一、详细解析Java中抽象类和接口的区别
转:二十一.详细解析Java中抽象类和接口的区别 http://blog.csdn.net/liujun13579/article/details/7737670 在Java语言中, abstract ...
- Java中Long与long的区别(转)
Java中Long与long的区别(转) [本文转载自:http://www.cnblogs.com/bluestorm/archive/2012/04/22/2464739.html] 转载请联系原 ...
随机推荐
- Security 安全框架1
security 过滤器链 检查请求是否有请求信息-主要校验规则 UsernamePasswordAuthenticationFilter: 处理表单登录, 请求是否带用户名密码 BasicAuthe ...
- markupsafe._compat出错的解决办法
在windows下用pip进行安装的flask和freeze会在运行程序的时候出现报错 markupsafe._compat出错,那么此时找到对应的pip文件夹下自己创建一个_compat.py 然后 ...
- 使用HtmlAgilityPack将HtmlTable填入DataTable
HtmlAgilityPack.HtmlWeb hw = new HtmlAgilityPack.HtmlWeb(); HtmlAgilityPack.HtmlDocument doc = hw.Lo ...
- 20155235 2016-2017-2 《Java程序设计》第十周学习总结
20155235 2016-2017-2 <Java程序设计>第十周学习总结 教材学习内容总结 计算机网络 计算机网络由若干结点和连接这些结点的链路组成.网络中的结点可以是计算机.集线器. ...
- 20155332 2016-2017-2 《Java程序设计》实验一 Java开发环境的熟悉
实验内容 使用JDK编译.运行简单的Java程序: 使用IDEA 编辑.编译.运行.调试Java程序. 实验知识点 JVM.JRE.JDK的安装位置与区别: 命令行运行javac:java:javac ...
- c#字符串加载wpf控件模板代码 - 简书
原文:c#字符串加载wpf控件模板代码 - 简书 ResourceManager resManagerA = new ResourceManager("cn.qssq666.Properti ...
- [2016北京集训试题8]连在一起的幻想乡[dp+无向图计数]
Description Solution 本博客参考yww大佬的博客,为了加深理解我就自己再写一遍啦. 以下的“无向图”均无重边无自环. 定义f0[n]为n个点构成的无向图个数,f1[n]为n个点构成 ...
- IDEA 运行报错 failed to create a child event loop
背景 在IDEA中写了测试代码,但是运行的时候一直提示 java.lang.IllegalStateException: failed to create a child event loop ... ...
- 【LG5018】[NOIP2018pj]对称的二叉树
[LG5018][NOIP2018pj]对称的二叉树 题面 洛谷 题解 看到这一题全都是用\(O(nlogn)\)的算法过的 考场上写\(O(n)\)算法的我很不开心 然后就发了此篇题解... 首先我 ...
- PHP 中的mktime()函数本周时间
上周写一个接口,用到了本周的开始时间和结束时间作为筛选条件去筛选数据,我只记得有mktime()这个函数,具体怎么用的不太清楚,于是百度之,找到了这个: 本周开始时间:date("Y-m-d ...