public class shishi
{
public static void main (String args[])
{
String ss = "123";
System.out.println(ss);
fun(ss);
System.out.println(ss);
}
public static void fun(String s)
{
s = "asd"; //为什么不在原内存地址修改内容,而要新开辟内存空间再改变指向?
}
}
对比C++
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
void fun(string &s)
{
s = "asd";
}
int _tmain(int argc, _TCHAR* argv[])
{
string ss = "123";
cout<<ss<<endl;
fun(ss);
cout<<ss;
return 0;
}
结果完全不同,有没有知道改如何理解这点区别的
------解决方案--------------------
void fun(string &s)引用的是地址,java里没有指针,不引用地址,对于对象的操作是值引用
------解决方案--------------------
这是C++比Java灵活的一个表现
C++支持值传递、地址传递和引用传递,而Java只支持值传递,这样C++那段程序就显得高效率。
你的第一段程序中,虽然调用fun方法时参数是引用,但是我们可以把这个引用看成一个值,所以这个值是无法改变的,所以当你在函数体中试图改变这个值时,必然是会失败的;但是C++支持引用传递,所以可以轻松的改变这个引用指向的值。
------解决方案--------------------
本来Java绝对效率就不如C/C++,你要说这是个效率问题,那垃圾回收,各种错误预防机制,超多层次各种封装继承更是致命的效率问题,学Java重点是实现和算法,能正确实现的代码比你有效率但Bug百出的代码强一百倍,使用优秀算法的Java程序效率往往能比小白C/C++程序员写出的垃圾算法程序强好多倍,一味质疑某种语言效率是没有意义的,同样只抓细枝末节而忽视全局的优化是愚蠢的,大师高德纳说过,过早优化是一切邪恶之源。
回到问题本身,首先在C/C++中,一切关于指针的操作都是危险的,它有可能指到系统保护区或其他乱七八糟的地方如果你不注意,所以Java里直接废了指针。而且你那个C++代码,看似没问题,但实际上为了那一点效率你要牺牲很多安全性,比如string重新赋值的时候有可能越界,而C/C++自身不提供越界保护,但Java不能容忍这样的情况。再者Java里的String和C++里的String有很大区别,Java的String是不可变值的,也就是一个String对象的值永远只有一个,你重新赋值的话实际上是重新创建一个对象。你要像C/C++那样操作String,唯一相近的只有char数组,你可以对char数组进行修改它不会重新开辟内存空间,或者按照OOP的原则可以使用StringBuffer和StringBuilder。
总之C/C++是用安全性来换取最大的自由,他们充分相信每个程序员都能做优秀的程序员,但实际情况并不是这样,所以Java诞生了,它牺牲了很多自由但换取了高度的安全性和开发效率。学一种语言就要理解它的精髓和意义,你总是用另一种语言的思维来思考一种语言是学不好这种语言的,这个道理和为什么很多人学了十几年的英语都基本还是个半哑巴半聋子是一样的,因为他们学英语总是要问中文是什么意思,总是抱着各种汉英英汉词典,各种单词书语法书,却从来没有真正用过英文来感知世界。
------解决方案--------------------
我日,Java的引用和C++中的引用,不是一个概念。
C++的引用,传的是地址或者说是指针,
Java的引用,没有指针的概念,不会传地址或者指针过去的。
只是一个称谓而已,你别当真啊。