//C++例子
#include <iostream>
using namespace std;
int doHello (std::string&);
int main() {
std::string str1 = "perry";
cout << "String=" << str1 << endl;
doHello(str1);
cout << "String=" << str1 << endl; // prints pieterson
return 0;
}
int doHello(std::string& str){
str = "pieterson";
cout << "String=" << str << endl;
return 0;
}
在上述情况下,正如预期的那样,当 str 引用被修改时,字符串 'str1' 引用也被修改
//Java示例
public class hello {
public static void main(String args[]){
String str1 = "perry";
System.out.println("String=" + str1);
doHello(str1);
System.out.println("String=" + str1); // does not prints pieterson
}
public static void doHello(String str){
str = "pieterson";
System.out.println("String = " + str);
}
}
在 Java 中,String str 和 String str1 是两个不同的对象,最初引用同一个 String,所以当我们在 doHello() 中更改 str 引用时,str1 引用不会改变。
我们如何在 Java 中使用字符串、集合(如列表、 vector 和其他对象)实现 C++ 风格的功能。
更新:
感谢Jon的精彩讲解,相信任何Java初学者都会遇到这个问题。 让我解释一下我在使用列表时遇到的问题。
//bad doHello()
void doHello(List inputList) {
inputList = getListFromAnyFunction(); // wrong, didnt work
}
// good doHello
void doHello(List inputList) {
inputList.addAll(getListFromAnyFunction()); // worked
}
感谢 Powell 和 Harshath 的解释和代码示例。
最佳答案
Java 根本没有通过引用传递(您在 C++ 代码中使用的)。引用按值传递。 (str
和 str1
的值根本不是对象,它们是引用 - 将这两个概念分开确实很有帮助。)
如果需要,通常您会使用返回值来返回新的引用:
str1 = doHello(str1);
请注意,String 与 List 等略有不同,因为字符串是不可变的。要修改一个集合(好吧,任何可变集合)你不需要创建一个新集合,你只需通过原始引用修改对象:
public static void addHello(List<String> items)
{
items.add("Hello");
}
然后你可以这样调用它:
List<String> list = new ArrayList<String>();
addHello(list);
System.out.println(list.get(0)); // "Hello"
改变现有对象 和更改变量值以引用不同 对象之间的区别至关重要。如果您想单独保留现有集合并创建一个新集合,则必须明确地这样做:
public static List<String> withHello(List<String> items)
{
List<String> newList = new ArrayList<String>(items);
newList.add("Hello");
return newList;
}
然后你可以这样调用它:
List<String> empty = new ArrayList<String>();
List<String> newList = withHello(empty);
System.out.println(empty.size()); // Prints 0
System.out.println(newList.size()); // Prints 1
这是否满足了您的所有需求?
关于java - C++ 引用和 Java 引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/979814/