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是通过值传递,也就是通过拷贝传递——通过方法操作不同类型的变量加深理解(勿删)的更多相关文章

  1. 3-java中String值为空字符串与null的判断方法

    java中String值为空字符串与null的判断方法 2018年01月21日 14:53:45 阅读数:1189 Java空字符串与null的区别 1.类型 null表示的是一个对象的值,而不是一个 ...

  2. Java 中的值传递和参数传递

    Java中没有指针,所以也没有引用传递了,仅仅有值传递不过可以通过对象的方式来实现引用传递 类似java没有多继承 但可以用多次implements 接口实现多继承的功能 值传递:方法调用时,实际参数 ...

  3. Java中的值传递和引用传递

    这几天一直再纠结这个问题,今天看了这篇文章有点思路了,这跟C++里函数参数为引用.指针还是有很大区别. 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里 ...

  4. Java中的值传递

    1.先比较下字符串的比较 == 代表全等于 值和地址(存放地址) 全部相等于. equals 值等于== 和 equals的区别 列如下面的 如果name1==name2是等于的 然而name1==n ...

  5. Java 到底是值传递还是引用传递

    作者:Intopass链接:https://www.zhihu.com/question/31203609/answer/50992895来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业 ...

  6. Java的参数传递是「值传递」还是「引用传递」?

    关于Java传参时是引用传递还是值传递,一直是一个讨论比较多的话题. 有人说Java中只有值传递,也有人说值传递和引用传递都是存在的,比较容易让人产生疑问. 关于值传递和引用传递其实需要分情况看待. ...

  7. 为什么说Java中只有值传递

    本文转载自公众号 Hollis 对于初学者来说,要想把这个问题回答正确,是比较难的.在第二天整理答案的时候,我发现我竟然无法通过简单的语言把这个事情描述的很容易理解,遗憾的是,我也没有在网上找到哪篇文 ...

  8. 一道笔试题来理顺Java中的值传递和引用传递

      题目如下: private static void change(StringBuffer str11, StringBuffer str12) { str12 = str11; str11 = ...

  9. java中的值传递和引用传递有什么区别呀?

    值传递: (形式参数类型是基本数据类型和String):方法调用时,实际参数把它的值传递给对应的形式参数,形式参数只是用实际参数的值初始化自己的存储单元内容,是两个不同的存储单元,所以方法执行中形式参 ...

随机推荐

  1. hdoj 3836 Equivalent Sets【scc&&缩点】【求最少加多少条边使图强连通】

    Equivalent Sets Time Limit: 12000/4000 MS (Java/Others)    Memory Limit: 104857/104857 K (Java/Other ...

  2. 一步一步制作yaffs/yaffs2根文件系统(七)---真挚地道歉以及纠正前边出现的错误!

    接上一节http://blog.csdn.net/mybelief321/article/details/10040939 说实话,我当时写这个系列的博文的时候,感觉对BusyBox算是有点了解,直到 ...

  3. Java集合类详解

    集合类说明及区别Collection├List│├LinkedList│├ArrayList│└Vector│ └Stack└SetMap├Hashtable├HashMap└WeakHashMap ...

  4. tcpdump来抓取执行的sql语句

    # tcpdump -n -nn -tttt -i eth1 -s 65535 'port 3306' -w tcpdump_mysql.ret -C 100 一个TCP包中包含多个mysql协议包, ...

  5. 【设计模式 - 21】之空对象模式(Null Object)

    1      模式简介 在空对象模式中,一个空对象取代NULL对象的实例的检查.NULL对象不是检查空值,而是反映一个不做任何动作的关系.这样的NULL对象也可以在数据不可用的时候提供默认的行为. 在 ...

  6. cas改造随笔

    原http://www.cnblogs.com/hellowood/archive/2010/08/05/1793364.html 键字: sso域名:cas.server.com 登陆地址(spri ...

  7. linux下so动态库一些不为人知的秘密 系列

    http://blog.chinaunix.net/uid-27105712-id-3313293.html http://www.cnblogs.com/gulvzhe/archive/2012/0 ...

  8. WPF组件开发

    在做组件之前,为了适应框架,我们需要有一个基类,并将这个基类打包成一个模板,让大部分组件去使用这个模板. 组件的基类就不多讲了,上篇文章中已经说过了.这是地址: http://www.cnblogs. ...

  9. 理解FTP协议

    为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处.LaplaceDemon/ShiJiaqi. http://www.cnblogs.com/shijiaqi1066/p/5186117. ...

  10. ArcGIS 在地图上添加标注

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...