博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java传值和传址
阅读量:5840 次
发布时间:2019-06-18

本文共 3652 字,大约阅读时间需要 12 分钟。

 

 

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; 

转载于:https://www.cnblogs.com/happyPawpaw/p/3399974.html

你可能感兴趣的文章
加热炉简是新来的整个系统的板
查看>>
Mockito使用注意事项
查看>>
[LeetCode] Palindrome Linked List 回文链表
查看>>
UVA - 825Walking on the Safe Side(dp)
查看>>
android大概是通过logcat拦截Log
查看>>
关于codeMirror插件使用的一个坑
查看>>
评论:人才流失强力折射出现实畸形人才观
查看>>
git服务器gitlab之搭建和使用--灰常好的git服务器【转】
查看>>
基于机器学习的web异常检测——基于HMM的状态序列建模,将原始数据转化为状态机表示,然后求解概率判断异常与否...
查看>>
分享一种需求评审的方案
查看>>
虚拟运营商10月或大面积放号 哭穷背后仍有赢家
查看>>
Server2016开发环境配置
查看>>
分布式光伏发电建设中的逆变器及其选型
查看>>
增强网络安全防御 推动物联网走向应用
查看>>
UML中关联,组合与聚合等关系的辨析
查看>>
《大数据管理概论》一3.2 大数据存储与管理方法
查看>>
PowerBuilder开发简单计算器
查看>>
怎样使用linux的iptables工具进行网络共享
查看>>
《HTML5与CSS3实战指南》——导读
查看>>
RHEL6下安装oracle 10g(一)
查看>>