首先说结论:Java中参数传递,不能修改数据指向,只能修改数据属性
Java函数传参,对于非引用类型(基本数据类型如int,float等),函数传参修改是没有任何效果的
对于引用数据类型,类(接口),数组,枚举等,修改的时候,也只能修改数据的属性,而不能修改“数据本身指向”
这个开始听起来很抽象,但是Java就是这样,不像C和C++中有二级指针,可以修改数据指向,有点像python中的函数对引用类型的处理,Java也不能修改数据指向
对比一下:
Java:对于经典的数组传参,java中String本身又是不可变类型
str = "hello"本身修改无效,而c = new char[] {'0', '0', '0', '0'}就是尝试修改本身,这是在Java中是无效的
public class T2 {
public static void change (String str, char c[]) {
str = "Hello";
c = new char[] {'0','0','0', '0'};
c[0] = 'M';
}
public final static void main(String[] args) {
String str = new String("Hello world");
char cString [] = new char[] {'h', 'e', 'l', 'l', 'o'};
change(str, cString);
System.out.println("str = "+str);
for(char c : cString) {
System.out.print(c);
}
System.out.println();
}
}
运行结果:
结果显示:两个修改一个效果都没有
但是我们可以在Java中修改数据的属性:
public class T2 {
public static void change (String str, char c[]) {
str = "Hello";
// c = new char[] {'0','0','0', '0'};
c[0] = 'M';
}
public final static void main(String[] args) {
String str = new String("Hello world");
char cString [] = new char[] {'h', 'e', 'l', 'l', 'o'};
change(str, cString);
System.out.println("str = "+str);
for(char c : cString) {
System.out.print(c);
}
System.out.println();
}
}
注释掉上面尝试改变指向的代码之后,此时没有在堆中修改临时开的这段内存(new char[] {'0', '0', '0', '0'}),而是修改传入的引用类型本身的属性,于是有效
输出结果:
对比一下python:
python也不支持函数中修改指向
class Stu:
def __init__(self, name):
self.name = name
def say(self):
print(self.name, "is saying")
def change_dir(person):
person = Stu("xiaohong")
person.say()
def main():
xiaoming = Stu("xiaoming")
xiaoming.say()
change_dir(xiaoming)
xiaoming.say()
if __name__ == "__main__":
main()
运行结果:
C++和C就不举例了,一级指针修改内容,与Java, Python效果相同
二级指针修改指向,Java中没有这种操作,当然Python中也没有