java是通过值传递,也就是通过拷贝传递——通过方法操作不同类型的变量加深理解(勿删)
head first java里写到“java是通过值传递的,也就是通过拷贝传递”,由此得出结论,方法无法改变调用方传入的参数。该怎么理解呢?
看例子:
public class Test1 {
public static void main(String[] args) {
int x = 7;
System.out.println("传入方法之前:x="+x);
addOne(x);
System.out.println("传入方法之后:x="+x);
}
private static void addOne(int y){
y++;
System.out.println("传入参数被改变:y="+y);
}
}
输出:
传入方法之前:x=7
传入参数被改变:y=8
传入方法之后:x=7
因为方法改变的只是值的拷贝(变量y的值),所以对原值(变量x的值)不产生影响。所以x的值在被传入方法前后都为7.
那么在看下面的例子
public class Dog {
String name;
int age;
省略get,set
}
public class Test2 {
public static void main(String[] args) {
Dog yellow = new Dog();
yellow.setName("大黄");
System.out.println("传入方法之前:yellow的名字是"+yellow.getName());
changeName(yellow);
System.out.println("传入方法之后:yellow的名字是"+yellow.getName());
}
private static void changeName(Dog white){
white.setName("小白");
System.out.println("传入参数被改变:white的名字是"+white.getName());
}
}
传入方法之前:yellow的名字是大黄
传入参数被改变:white的名字是小白
传入方法之后:yellow的名字是小白
yellow的名字在被传入方法之前是“大黄”,传入方法之后却变成了“小白”,那么“方法无法改变调用方传入的参数”的说法是否仍然成立呢?
答案是肯定的。
Dog yellow与int i 的不同之处,int i 是primitive主数据类型变量,变量值就是7,所以拷贝给y的值是7,addOne方法执行前后x始终等于7。而前者是对象引用变量(yellow是获取Dog对象的位表示法,即所谓的指针),所以拷贝给Dog white的只是一个指针,yellow和white同时指向了堆内存中的同一个Dog对象。changeName方法改变了被指向的Dog对象的实例变量name的值,但是yellow指针始终指向这个Dog对象,被传入的值(指针)没有发生变化。
java是通过值传递,也就是通过拷贝传递——通过方法操作不同类型的变量加深理解(勿删)的更多相关文章
- 3-java中String值为空字符串与null的判断方法
java中String值为空字符串与null的判断方法 2018年01月21日 14:53:45 阅读数:1189 Java空字符串与null的区别 1.类型 null表示的是一个对象的值,而不是一个 ...
- Java 中的值传递和参数传递
Java中没有指针,所以也没有引用传递了,仅仅有值传递不过可以通过对象的方式来实现引用传递 类似java没有多继承 但可以用多次implements 接口实现多继承的功能 值传递:方法调用时,实际参数 ...
- Java中的值传递和引用传递
这几天一直再纠结这个问题,今天看了这篇文章有点思路了,这跟C++里函数参数为引用.指针还是有很大区别. 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里 ...
- Java中的值传递
1.先比较下字符串的比较 == 代表全等于 值和地址(存放地址) 全部相等于. equals 值等于== 和 equals的区别 列如下面的 如果name1==name2是等于的 然而name1==n ...
- Java 到底是值传递还是引用传递
作者:Intopass链接:https://www.zhihu.com/question/31203609/answer/50992895来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业 ...
- Java的参数传递是「值传递」还是「引用传递」?
关于Java传参时是引用传递还是值传递,一直是一个讨论比较多的话题. 有人说Java中只有值传递,也有人说值传递和引用传递都是存在的,比较容易让人产生疑问. 关于值传递和引用传递其实需要分情况看待. ...
- 为什么说Java中只有值传递
本文转载自公众号 Hollis 对于初学者来说,要想把这个问题回答正确,是比较难的.在第二天整理答案的时候,我发现我竟然无法通过简单的语言把这个事情描述的很容易理解,遗憾的是,我也没有在网上找到哪篇文 ...
- 一道笔试题来理顺Java中的值传递和引用传递
题目如下: private static void change(StringBuffer str11, StringBuffer str12) { str12 = str11; str11 = ...
- java中的值传递和引用传递有什么区别呀?
值传递: (形式参数类型是基本数据类型和String):方法调用时,实际参数把它的值传递给对应的形式参数,形式参数只是用实际参数的值初始化自己的存储单元内容,是两个不同的存储单元,所以方法执行中形式参 ...
随机推荐
- Code Forces 711D Directed Roads
D. Directed Roads time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...
- Oracle中分页查询语句
Oracle分页查询语句使我们最常用的语句之一,下面就为您介绍的Oracle分页查询语句的用法,如果您对此方面感兴趣的话,不妨一看. Oracle分页查询语句基本上可以按照本文给出的格式来进行套用.O ...
- 3proxy代理软件文档说明
官方英文原版说明:http://www.3proxy.ru/howtoe.asp 配置文件的简要说明:如果你的英文理解力好,可以试着研究一下他的手册. 以实例说明吧 nscache 65536域名解析 ...
- Pgsql数据库jsonb操作函数集合
CREATE OR REPLACE FUNCTION "json_object_del_path"( "json" json, "key_path&q ...
- 我是怎么拿到百度2016校招Offer的——IT技术类校招成功面经
笔者是软件工程大四学生,属于保研失败群体,不想考研,所以选择了工作.从9月下保研失败到10月中成功拿到百度Offer,这其中的大起大落真是外人所无法体会的.这一段时间的面试经验,可以和大家分享一下.笔 ...
- sql优化-hint的作用
目前,oracle采用的是CBR优化器,所以在有些时候,机器会按照自己的意愿去执行sql,当然oracle是根据本身的一些信息来做决定的,比如:统计信息.但有些时候,机器并不一定会按照我们预想的那样去 ...
- 《Linux内核设计与实现》学习笔记之“Linux进程管理机制”
一.进程(或者称为“任务”)简介 进程是OS最基本的抽象之一,通常进程包括“可执行程序代码”,“其他资源”(如:打开的文件,挂起的信号,内核内部数据,处理器状态,地址空间,一个或多个执行线程等) 二. ...
- HTML5另类塔防游戏 -《三国战线》公布
关于本作 游戏介绍 本游戏是一款另类塔防游戏.本作以三国这段历史为题材,提供了从颍川之战到官渡之战.官渡之战到夷陵之战.夷陵之战到五丈原之战等15个关卡.在每一个关卡中,你会控制一名三国武将与出现的敌 ...
- Android 中 更新视图的函数ondraw() 和dispatchdraw()的区别
绘制VIew本身的内容,通过调用View.onDraw(canvas)函数实现 绘制自己的孩子通过dispatchDraw(canvas)实现 View组件的绘制会调用draw(Canvas canv ...
- Kia's Calculation(贪心)
pid=4726">http://acm.hdu.edu.cn/showproblem.php? pid=4726 大致题意:给两个长度小于10^6且相等的合法的正整数.你能够随意组合 ...