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):方法调用时,实际参数把它的值传递给对应的形式参数,形式参数只是用实际参数的值初始化自己的存储单元内容,是两个不同的存储单元,所以方法执行中形式参 ...
随机推荐
- 普通Windows控制台窗口运行nmake编译VC
我的GDAL编译都是在VS2012提供的prompt windows里面运行nmake完成的.但是如果想将编译自动化,放到Jenkins里面怎么办呢?首先没有VS2012的工程,也不想费力去生成一个, ...
- 8-10-Exercise
链接:第三次练习 A.ZOJ 3203 Light Bulb 这道题............哎~既可以用数学直接推导出来,也可以三分求,还可以二分求~~~~ NO1.数学公式 这种方法搞的不是很清楚 ...
- 【设计模式 - 23】之模版方法模式(Template)
1 模式简介 模版方法模式的定义: 模版方法模式在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中.模版方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤. 模版方法模 ...
- find job
处于找工作的状态... 优秀求职者的5个问题: 1.在刚进来2-3个月里,你希望我可以完成哪些工作? 2.公司的优秀员工共同特征是什么? 3.业余时间,公司的员工一般在干什么?
- CCControlSlider和CCControlStepper用法
一开始,size的大小是系统分配.玩家可以通过setDefaultSize()更改值 1. CCControlSlider用法 CCSpriteFrameCache::sharedSpriteFram ...
- InnoDB还是MyISAM (摘录)
两种类型最主要的差别就是Innodb 支持事务处理与外键和行级锁.而MyISAM不支持.所以MyISAM往往就容易被人认为只适合在小项目中使用. 我作为使用MySQL的用户角度出发,Innodb和My ...
- NDK开发之访问域
Java有两类域,实例域和静态域.类的每个实例都有自己的实例域副本,而一个类的所有实例共享一个静态域(Java SE基础). JNI提供了相应的函数来访问这两类域,总体步骤是这样的: 1.通过对象引用 ...
- 获取DLL的文件路径以及调用DLL的文件路径
如何在DLL中,获取DLL本身的路径以及调用DLL的文件的路径呢?主要通过GetModuleFileName(HMODULEhModule,LPTSTR lpFilename,DWORD nSize) ...
- centos6.7 install chrome
1.yum仓库 (如果用rpm包安装 可以忽略此步) vim /etc/yum.repos.d/google-chrome.repo [google-chrome] name=google-chrom ...
- apache的一些基本配置
Apache的配置由httpd.conf文件配置,因此下面的配置指令都是在httpd.conf文件中修改. 主站点的配置(基本配置) 基本配置: ServerRoot "/mnt/softw ...