[Java]函数传参分析

首先说结论: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'}),而是修改传入的引用类型本身的属性,于是有效

输出结果:

[Java]函数传参分析_第1张图片

对比一下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()

运行结果:

[Java]函数传参分析_第2张图片

C++和C就不举例了,一级指针修改内容,与Java, Python效果相同

二级指针修改指向,Java中没有这种操作,当然Python中也没有

你可能感兴趣的:(Java)