到底是值传递,还是引用传递?

对这个问题,以前看过几遍,还经常有点误解,现重新总结如下

计算机语言给子程序传递参数方法有2种
  • 1、值传递(call-by-value)
  •         将一个参数(value)复制成为子程序的正式参数。这样,对子程序参数的改变不影响调用它的参数。
  • 2、引用传递(call-by-reference)
  •         将参数的引用(而不是参数值)被传递给子程序参数。在子程序中,该引用用来访问调用中指定的实际参数。这样,对子程序的改变将会影响调用子程序的参数。

Java中参数传递是分为2类
  • 1、基本类型: 按值传递的
  • 2、传递对象: 按引用传递

 public static void main(String[] args) {
		int i = 0;
		changeInt(i);// 传递基本类型
		System.out.println(i);// 打印结果为:0
	}

	static void changeInt(int in) {
		// 传递的是值0
		
		in = 10;// 对i无影响
	}

 static class Human {
		String name;

		public void setName(String name) {
			this.name = name;
		}

		public String getName() {
			return name;
		}
	}

	public static void main(String[] args) {
		Human human = new Human();
		human.setName("dimao");

		changeName(human);// 传递对象
		System.out.println(human.getName());// 打印结果为:jeck
	}

	static void changeName(Human in) {
		// 引用(in)指向human

		in.setName("jeck");// 改变了human的name属性
	}

注意
  • 1、当一个对象引用被传递给方法时,引用本身使用按值调用被传递,被传递的值指向一个对象。
  • 2、当方法里的参数引用被重新指向其他对象后,对该引用的改变就和原对象无关了。

 static class Human {
		String name;

		public void setName(String name) {
			this.name = name;
		}

		public String getName() {
			return name;
		}
	}

	public static void main(String[] args) {
		Human human = new Human();
		human.setName("dimao");

		changePointer(human);// 传递对象
		System.out.println(human.getName());// 打印结果为:dimao
	}

	static void changePointer(Human in) {
		// 引用(in)指向human

		Human another = new Human();
		in = another;// 引用(in)被重新指向another
		in.setName("jeck");// 改变对human对象无影响
	}

你可能感兴趣的:(引用传递)