昨天一个人跑到昆山市区的新华书店,看到了一本叫做《你必须知道的261个java语言问题》,讲的都是一些很基础,但大家几乎都没明白的问题。至少对我来说是这样的。感觉很不错,不过并没有下手,因为新华书店的书都是不打折的,所以准备回来再往上订购。看到其中一个题目就是参数传递中的传值和传址的区别,讲的很清楚。引因为上次面试的时候面试官就问道了我这道题,再会想到自己当时的回答,惭愧啊!
不多说了,早上起来试着自己写了一段代码,以证实书上所讲的内容
运行结果如下:
传值引用
姓名:wangxianxing年龄:21
姓名:wangxianxing年龄:21
传址引用
姓名:wangxianxing年龄:21
姓名:kingxianstar年龄:22
例外情况一
姓名:kingxianstar年龄:22
感觉还不是很全面,所以在网上又搜索了一下,发现了这篇(http://mgc.name/article.asp?id=842)
What is the output of the program shown in the exhibit?
A. 300-100-100-100-100
B. 300-300-100-100-100
C. 300-300-300-100-100
D. 300-300-300-300-100
Answer: B
涉及知识点:
1.Java中的参数传递有传值和传址两种;
2.基本类型和String型作为参数时,为传值方式,只把值传入方法,不管在方法中怎么处理这个参数,原值不变;
3.其他引用类型作为参数时,为传址方式,将指向内存中的地址传入方法,方法中此内存地址中的值发生变化时,原值也会改变;
4.例外:
(1)如果引用类型的对象通过传址方式将其指向内存中的地址传入方法后,方法中使用new关键字重新给参数赋值时,会在内存中重新开辟空间,参数指向新的内存空间,此时参数和原对象指向的就不是同一个地址了,参数值的变化不会改变原值;
(2)String型是引用类型,但是String型作为参数,是传值方式,可以通过以下两种方式来理解:
<1>String本质上是基本类型的char[],基本类型作为参数时,为传值方式;
<2> 字符串在内存中是存储在堆中的一个常量,String对象指向内存中这个常量的地址,通过传址方式将地址传入方法后,方法中如果通过字符串给参数赋值,则会重新在堆中创建一个字符串常量,并指向这个地址,原值依然指向原来的字符串常量地址,参数值的变化不会改变原值,如果通过new关键字给参数赋值,参见 (1)中的解释。
解析:
1.“Foo foo = new Foo(300);”,此时foo.getX()的值为300;
2.“Foo fooFoo = fooBar(foo);”,因为Foo是引用类型,main方法中的foo通过传址的方式将其指向的地址传给fooBar方法中的foo,此时两个foo指向同一个地址,foo.getX()的值都为300;通过“new Foo(100)”给fooBar方法中的foo赋值后,该foo重新指向了一个新的地址,foo.getX()的值为新地址中的值100,而main方法中的foo仍然指向原来的地址,foo.getX()的值没有改变,仍为 300;fooBar将foo的值返回给fooFoo,因此fooFoo.getX()的值为100;
3.“foo = fooBar(fooFoo);”,同2中的解释,foo.getX()的值变为100,fooFoo.getX()的值没有变化,仍为100;
另外传值和传址的存储也是不一样的 在传址中有两部分(堆和栈)。
不多说了,早上起来试着自己写了一段代码,以证实书上所讲的内容
public class CallValueOrAddress{ private String name; private int age; public void setName(String name){ this.name=name; } public String getName(){ return name; } public void setAge(int age){ this.age=age; } public int getAge(){ return age; } public static void main(String agrs[]){ String str_name="wangxianxing"; String new_name="nihao"; int int_age=21; int new_age=22; System.out.println("传值引用"); System.out.println("姓名:"+str_name+"年龄:"+int_age); new_name=str_name; new_name=new String("nihaoma?"); new_age=int_age; new_age=22; System.out.println("姓名:"+str_name+"年龄:"+int_age); CallValueOrAddress cvoa=new CallValueOrAddress(); cvoa.setName("wangxianxing"); cvoa.setAge(21); System.out.println("传址引用"); System.out.println("姓名:"+cvoa.getName()+"年龄:"+cvoa.getAge()); CallValueOrAddress new_cvoa=cvoa; new_cvoa.setName("kingxianstar"); new_cvoa.setAge(22); System.out.println("姓名:"+cvoa.getName()+"年龄:"+cvoa.getAge()); System.out.println("例外情况一"); new_cvoa=new CallValueOrAddress(); new_cvoa.setName("kingxianstar+kingxianstar"); new_cvoa.setAge(32); System.out.println("姓名:"+cvoa.getName()+"年龄:"+cvoa.getAge()); } }
运行结果如下:
传值引用
姓名:wangxianxing年龄:21
姓名:wangxianxing年龄:21
传址引用
姓名:wangxianxing年龄:21
姓名:kingxianstar年龄:22
例外情况一
姓名:kingxianstar年龄:22
感觉还不是很全面,所以在网上又搜索了一下,发现了这篇(http://mgc.name/article.asp?id=842)
class Foo { private int x; public Foo(int x) { this.x = x; } public void setX(int x) { this.x = x; } public int getX() { return x; } } public class Submit { static Foo fooBar(Foo foo) { foo = new Foo(100); return foo; } public static void main(String[] args) { Foo foo = new Foo(300); System.out.print(foo.getX() + "-"); Foo fooFoo = fooBar(foo); System.out.print(foo.getX() + "-"); System.out.print(fooFoo.getX() + "-"); foo = fooBar(fooFoo); System.out.print(foo.getX() + "-"); System.out.print(fooFoo.getX()); } }
What is the output of the program shown in the exhibit?
A. 300-100-100-100-100
B. 300-300-100-100-100
C. 300-300-300-100-100
D. 300-300-300-300-100
Answer: B
涉及知识点:
1.Java中的参数传递有传值和传址两种;
2.基本类型和String型作为参数时,为传值方式,只把值传入方法,不管在方法中怎么处理这个参数,原值不变;
3.其他引用类型作为参数时,为传址方式,将指向内存中的地址传入方法,方法中此内存地址中的值发生变化时,原值也会改变;
4.例外:
(1)如果引用类型的对象通过传址方式将其指向内存中的地址传入方法后,方法中使用new关键字重新给参数赋值时,会在内存中重新开辟空间,参数指向新的内存空间,此时参数和原对象指向的就不是同一个地址了,参数值的变化不会改变原值;
(2)String型是引用类型,但是String型作为参数,是传值方式,可以通过以下两种方式来理解:
<1>String本质上是基本类型的char[],基本类型作为参数时,为传值方式;
<2> 字符串在内存中是存储在堆中的一个常量,String对象指向内存中这个常量的地址,通过传址方式将地址传入方法后,方法中如果通过字符串给参数赋值,则会重新在堆中创建一个字符串常量,并指向这个地址,原值依然指向原来的字符串常量地址,参数值的变化不会改变原值,如果通过new关键字给参数赋值,参见 (1)中的解释。
解析:
1.“Foo foo = new Foo(300);”,此时foo.getX()的值为300;
2.“Foo fooFoo = fooBar(foo);”,因为Foo是引用类型,main方法中的foo通过传址的方式将其指向的地址传给fooBar方法中的foo,此时两个foo指向同一个地址,foo.getX()的值都为300;通过“new Foo(100)”给fooBar方法中的foo赋值后,该foo重新指向了一个新的地址,foo.getX()的值为新地址中的值100,而main方法中的foo仍然指向原来的地址,foo.getX()的值没有改变,仍为 300;fooBar将foo的值返回给fooFoo,因此fooFoo.getX()的值为100;
3.“foo = fooBar(fooFoo);”,同2中的解释,foo.getX()的值变为100,fooFoo.getX()的值没有变化,仍为100;
另外传值和传址的存储也是不一样的 在传址中有两部分(堆和栈)。
发表评论
-
Hashtable和HashMap
2010-11-16 10:48 631HashTable的应用非常广泛,HashMap是新框架中用来 ... -
在含有负数的一百个整数中,找出连续三个数之和最大的部分
2010-11-12 11:39 2472在含有负数的一百个整数中,找出连续三个数之和最大的部分,并打印 ... -
将阿拉伯数值金额转化为中文金额
2010-11-09 23:20 948最近面临着找工作,就经常上网找一些常见的面试题,这次的就是把阿 ... -
构造器是类的静态方法?
2010-09-10 15:40 1160《Java编程思想》中文版第四版的315页的第二段是这么写的: ... -
Pattern和Matcher
2010-09-09 19:51 978一般来说,比起功能有限的String,我们更愿意构 ... -
为什么在重写equals()方法时,一般都会重写HashCode()方法?
2010-09-06 11:09 1738重写equals()方法主要是为了方便比较两个对象 ... -
数组的排序算法(插入排序、快速排序)
2010-09-04 14:52 1922在实现数组元素排序时,排序的算法有很多,例如冒泡排序法,选择排 ... -
X+=Y和X=X+Y两种实现加法方式的区别
2010-09-03 09:37 1330为了方便程序员进行频繁的赋值操作,Java提供了很多 ... -
不用系统函数将字符串转换成整型
2010-08-31 09:28 1909昨天无意中浏览到Magic的博客,发现里面又很多的好东西,讲的 ... -
String转Integer源码分析
2010-08-27 20:19 1453今天参加了开发类的面试,面试官问了我一个问题,给你一个Stri ...
相关推荐
Java是传值还是传址引用
Java SE程序 界面传值问题Java SE程序 界面传值问题Java SE程序 界面传值问题Java SE程序 界面传值问题Java SE程序 界面传值问题Java SE程序 界面传值问题Java SE程序 界面传值问题Java SE程序 界面传值问题Java SE...
java及C++中传值传递、引用传递和指针方式的理解.docx
11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java...
13.java参数传递之引用传递.zip13.java参数传递之引用传递.zip13.java参数传递之引用传递.zip13.java参数传递之引用传递.zip13.java参数传递之引用传递.zip13.java参数传递之引用传递.zip13.java参数传递之引用传递....
58.java参数传递机制.zip58.java参数传递机制.zip58.java参数传递机制.zip58.java参数传递机制.zip58.java参数传递机制.zip58.java参数传递机制.zip58.java参数传递机制.zip58.java参数传递机制.zip58.java参数传递...
关于Java参数传递的PPT,详细介绍参数传递的类型。彻底理解Java只有唯一传递方式——值传递。
java传值所用的基本方法与java传值时是传引用还是传值
前言在Java中,当对象作为参数传递时,究竟传递的是对象的值,还是对象的引用,这是一个饱受争议的话题。若传的是值,那么函数接收的只是实参本,函数对形参的操作并不
书上说:”把函数外部的值复制给函数内部的参数,就和把值从一个变量复制给另一个变量一样。基本类型的传递如同基本类型变量的复制一样,而引用类型的则如同引用类型变量的复制一样。“ ”当一个变量复制引用类型...
Java页面form表单值的简单获取方法
通过对典型程序的研究与分析可以看出JAVA语言的参数传递总是传值调用的,但是对于基本类型的参数和对象类型的参数来说,参数传递的情况不完全相同.Java语言不能直接使用传引用调用,但是可以通过数组的方式模拟传引用...
浅谈Java中方法的参数传值.pdf
java参数传递 java 参数
这里详细的说明了,java参数传递的过程,引用传递,值传递
Java参数传递的经典教学PPT,引用类型,基础类型传递的区别,String和StringBuffer类型传递的区别。
传值还是传引用 详细讲解JAVA参数传递机制 一目了然
Java中参数传值的代码清单.pdf 学习资料 复习资料 教学资源
62.java引用类型的参数传递.zip62.java引用类型的参数传递.zip62.java引用类型的参数传递.zip62.java引用类型的参数传递.zip62.java引用类型的参数传递.zip62.java引用类型的参数传递.zip62.java引用类型的参数传递....
59.java基本类型的参数传递.zip59.java基本类型的参数传递.zip59.java基本类型的参数传递.zip59.java基本类型的参数传递.zip59.java基本类型的参数传递.zip59.java基本类型的参数传递.zip59.java基本类型的参数传递....