`
kingxianstar
  • 浏览: 19614 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

Java参数传递中的传值和传址的区别

阅读更多
昨天一个人跑到昆山市区的新华书店,看到了一本叫做《你必须知道的261个java语言问题》,讲的都是一些很基础,但大家几乎都没明白的问题。至少对我来说是这样的。感觉很不错,不过并没有下手,因为新华书店的书都是不打折的,所以准备回来再往上订购。看到其中一个题目就是参数传递中的传值和传址的区别,讲的很清楚。引因为上次面试的时候面试官就问道了我这道题,再会想到自己当时的回答,惭愧啊!
不多说了,早上起来试着自己写了一段代码,以证实书上所讲的内容
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;


另外传值和传址的存储也是不一样的 在传址中有两部分(堆和栈)。
分享到:
评论

相关推荐

    Java是传值还是传址引用

    Java是传值还是传址引用

    Java SE程序 界面传值问题

    Java SE程序 界面传值问题Java SE程序 界面传值问题Java SE程序 界面传值问题Java SE程序 界面传值问题Java SE程序 界面传值问题Java SE程序 界面传值问题Java SE程序 界面传值问题Java SE程序 界面传值问题Java SE...

    java及C++中传值传递、引用传递和指针方式的理解.docx

    java及C++中传值传递、引用传递和指针方式的理解.docx

    11.java参数传递.zip

    11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java...

    13.java参数传递之引用传递.zip

    13.java参数传递之引用传递.zip13.java参数传递之引用传递.zip13.java参数传递之引用传递.zip13.java参数传递之引用传递.zip13.java参数传递之引用传递.zip13.java参数传递之引用传递.zip13.java参数传递之引用传递....

    58.java参数传递机制.zip

    58.java参数传递机制.zip58.java参数传递机制.zip58.java参数传递机制.zip58.java参数传递机制.zip58.java参数传递机制.zip58.java参数传递机制.zip58.java参数传递机制.zip58.java参数传递机制.zip58.java参数传递...

    Java参数传递PPT

    关于Java参数传递的PPT,详细介绍参数传递的类型。彻底理解Java只有唯一传递方式——值传递。

    java的传值与传值后的改变

    java传值所用的基本方法与java传值时是传引用还是传值

    23.Java对象作为参数传递是传值还是传引用1

    前言在Java中,当对象作为参数传递时,究竟传递的是对象的值,还是对象的引用,这是一个饱受争议的话题。若传的是值,那么函数接收的只是实参本,函数对形参的操作并不

    javascript的变量、传值、传址、参数之间关系

    书上说:”把函数外部的值复制给函数内部的参数,就和把值从一个变量复制给另一个变量一样。基本类型的传递如同基本类型变量的复制一样,而引用类型的则如同引用类型变量的复制一样。“  ”当一个变量复制引用类型...

    java中页面传值的简单操作

    Java页面form表单值的简单获取方法

    Java语言的方法参数浅析

    通过对典型程序的研究与分析可以看出JAVA语言的参数传递总是传值调用的,但是对于基本类型的参数和对象类型的参数来说,参数传递的情况不完全相同.Java语言不能直接使用传引用调用,但是可以通过数组的方式模拟传引用...

    浅谈Java中方法的参数传值.pdf

    浅谈Java中方法的参数传值.pdf

    java参数传递 java 参数.doc

    java参数传递 java 参数

    java参数传递

    这里详细的说明了,java参数传递的过程,引用传递,值传递

    Java参数传递的经典示例

    Java参数传递的经典教学PPT,引用类型,基础类型传递的区别,String和StringBuffer类型传递的区别。

    java 参数传递

    传值还是传引用 详细讲解JAVA参数传递机制 一目了然

    Java中参数传值的代码清单.pdf

    Java中参数传值的代码清单.pdf 学习资料 复习资料 教学资源

    62.java引用类型的参数传递.zip

    62.java引用类型的参数传递.zip62.java引用类型的参数传递.zip62.java引用类型的参数传递.zip62.java引用类型的参数传递.zip62.java引用类型的参数传递.zip62.java引用类型的参数传递.zip62.java引用类型的参数传递....

    59.java基本类型的参数传递.zip

    59.java基本类型的参数传递.zip59.java基本类型的参数传递.zip59.java基本类型的参数传递.zip59.java基本类型的参数传递.zip59.java基本类型的参数传递.zip59.java基本类型的参数传递.zip59.java基本类型的参数传递....

Global site tag (gtag.js) - Google Analytics