当前位置:首页 > 全部子站 > IT > 思科认证

《Java应用程序中的按值传递语义》的理解

来源:长理培训发布时间:2017-12-23 16:27:42

 百度广告


对此节选的某些反馈意见认为,我把这一问题搞糊涂了,或者将它完全搞错了。许多不同意我的读者用 C++ 语言作为例子。因此,在此栏目中我将使用 C++ 和 Java 应用程序进一步阐明一些事实。

要点  

C++ 和 Java 应用程序中的参数传递  

在继续讨论之前,定义按值传递和按引用传递这两个术语是重要的。按值传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的一个副本。因此,如果函数修改了该参数,仅改变副本,而原始值保持不变。按引用传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的内存地址,而不是值的副本。因此,如果函数修改了该参数,调用代码中的原始值也随之改变。


对象是按引用传递的 
3、按值传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的一个副本 

首先我们来看看第一点:对象是按引用传递的 


{  
String args)   
    java/lang/StringBuffer.java.html" target="_blank">StringBuffer s= new java/lang/StringBuffer.java.html" target="_blank">StringBuffer("good");  
StringBuffer s2=s;  
    java/lang/System.java.html" target="_blank">System.out.println(s);  
}

对象s和s2指向的是内存中的同一个地址因此指向的也是同一个对象。 

这里的意思是进行对象赋值操作是传递的是对象的引用,因此对象是按引用传递的,有问题吗? 
good afternoon.

这说明s2和s是同一个对象。

这里有一点要澄清的是,这里的传对象其实也是传值,因为对象就是一个指针,这个赋值是指针之间的赋值,因此在java中就将它说成了传引用。(引用是什么?不就是地址吗?地址是什么,不过就是一个整数值) |||

再看看下面的例子:


{  
String args)   
     int i=5;  
     i2=6;  
System.out.println(i);  
}

程序的结果是什么?5!!! 



{  
String args)   
    java/lang/StringBuffer.java.html" target="_blank">StringBuffer s= new java/lang/StringBuffer.java.html" target="_blank">StringBuffer("good");  
StringBuffer s2=new java/lang/StringBuffer.java.html" target="_blank">StringBuffer("bad");  
    java/lang/System.java.html" target="_blank">System.out.println(s);//9  
System.out.println(s2);//10  

  static void test(java/lang/StringBuffer.java.html" target="_blank">StringBuffer s,java/lang/StringBuffer.java.html" target="_blank">StringBuffer s2) {  
System.out.println(s);//1  
System.out.println(s2);//2  
   s=new java/lang/StringBuffer.java.html" target="_blank">StringBuffer("new");//4  
System.out.println(s);//5  
System.out.println(s2);//6  
   s2.append("hah");//8  
}

程序的输出是: 
bad 
good 
bad

为什么输出是这样的? 
我们看到1,2处的输出与我们的预计是完全匹配的 
因此5的输出打印的是新创建的对象的内容,而6打印的原来的s的内容 
Java 应用程序有且仅有的一种参数传递机制,即按值传递。

至此,我想总结一下我对这个问题的最后的看法和我认为可以帮助大家理解的一种方法: 
例如在c/c++中: 

print(p);//1 
print(*p);//2

1打印的结果是什么,一个16进制的地址,2打印的结果是什么?5,也就是指针指向的内容。 

而在java中一个对象s是什么,同样也是一个指针,也是一个int型的整数(对于JVM而言),我们在直接使用(即s2=s这样的情况,但是对于System.out.print(s)这种情况例外,因为它实际上被转换为System.out.print(s.toString()))对象时它是一个int的整数,这个可以同时解释赋值的传引用和传参数时的传值(在这两种情况下都是直接使用),而我们在s.XXX这样的情况下时s其实就是c/c++中的*s这样的使用了。这种在不同的使用情况下出现不同的结果是java为我们做的一种简化,但是对于c/c++程序员可能是一种误导。java中有很多中这种根据上下文进行自动识别和处理的情况,下面是一个有点极端的情况:


{  
String t="t";  
String args)   
    t t =new t();  
   }  
    java/lang/System.java.html" target="_blank">System.out.println(t);  
}

责编:罗莉

发表评论(共0条评论)
请自觉遵守互联网相关政策法规,评论内容只代表网友观点,发表审核后显示!

国家电网校园招聘考试直播课程通关班

  • 讲师:刘萍萍 / 谢楠
  • 课时:160h
  • 价格 4580

特色双名师解密新课程高频考点,送国家电网教材讲义,助力一次通关

配套通关班送国网在线题库一套

课程专业名称
讲师
课时
查看课程

国家电网招聘考试录播视频课程

  • 讲师:崔莹莹 / 刘萍萍
  • 课时:180h
  • 价格 3580

特色解密新课程高频考点,免费学习,助力一次通关

配套全套国网视频课程免费学习

课程专业名称
讲师
课时
查看课程
在线题库
面授课程更多>>
图书商城更多>>
在线报名
  • 报考专业:
    *(必填)
  • 姓名:
    *(必填)
  • 手机号码:
    *(必填)
返回顶部