- 讲师:刘萍萍 / 谢楠
- 课时:160h
- 价格 4580 元
特色双名师解密新课程高频考点,送国家电网教材讲义,助力一次通关
配套通关班送国网在线题库一套
百度广告
要点
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);
}
责编:罗莉
下一篇:Sybase:在“移动”里面成长
课程专业名称 |
讲师 |
课时 |
查看课程 |
---|
课程专业名称 |
讲师 |
课时 |
查看课程 |
---|
点击加载更多评论>>