java方法传递参数传递的到底是什么?值调用:引用调用

前言:在Java中我们常常会编写很多方法,大多数方法都会传递参数,那这参数传递的究竟是什么呢?是按值调用还是按引用调用?下面我们就来详细讨论下这个问题。

1.传递基本的数据类型:其实在java中总是采用的是按值调用,也就是说,方法得到的并不是传入参数的本身,而是传入参数的一个拷贝。方法并不能修改传递给它任何参数变量的内容。

╰(*°▽°*)╯举个栗子:

 

package com.zrh.test;

public class Student {

	private int sid;
	private String name;
	private double score;
	private int age;
	
	public static void addScore(double score){
		score = score+score;
		System.out.println("addScore_score:"+score);
	}
	
	public static void main(String[] args) {
		double score = 50;
		Student.addScore(score);
		System.out.println("main_score:"+score);
	}
}

 

结果:

 

addScore_score:100.0
main_score:50.0

 

结果分析:一个学生的分数是50分,调用addScore方法将分数翻倍,从打印出的信息可以看出addScore方法并没有改变传入的参数score的值,因为addScore实际传递的只是参数score的一个拷贝值,传入的参数score的作用域只在addScore方法内,方法执行完就被销毁了,对传递给方法的参数变量没有任何作用。

2.传递引用:传递的是对象引用的拷贝,拷贝变量和传入变量指向的是同一个对象,所以传递引用可以修改对象的参数。

╰(*°▽°*)╯举个栗子:

 

public class Student {

	private int sid;
	private String name;
	private double score;
	private int age;
	private static int nextId = 0;
	
	
	public Student() {
		nextId++;
		this.sid = nextId;
	}
	
	@Override
	public String toString() {
		return "Student [sid=" + sid + ", name=" + name + ", score=" + score
				+ ", age=" + age + "]";
	}

	public static void addScore(double score){
		score = score+score;
		System.out.println("addScore_score:"+score);
	}
	
	public static void editStudent(Student student){
		student.name = "jack";
		student.age = 15;
	}
	
	public static void swap(Student student1,Student student2){
		Student temp = student1;
		student1 = student2;
		student2 = student1;
	}
	
	public static void main(String[] args) {
		
		Student student = new Student();
		editStudent(student);
		System.out.println(student);
		
	}

}

运行结果:因为拷贝的引用变量和传入方法的引用变量指向同一个存储对象,所以在方法editStudent中修改了对象的参数,也就就是修改了传入的引用变量所指向对象的参数。

Student [sid=1, name=jack, score=0.0, age=15]

3.需要注意的问题:在很多时候我们都以为java对对象采用的是引用的调用,实际上是不对的,其实调用的是拷贝的引用。

╰(*°▽°*)╯举个栗子:

 

public class Student {

	private int sid;
	private String name;
	private double score;
	private int age;
	private static int nextId = 0;
	
	
	public Student() {
		nextId++;
		this.sid = nextId;
	}
	
	@Override
	public String toString() {
		return "Student [sid=" + sid + ", name=" + name + ", score=" + score
				+ ", age=" + age + "]";
	}

	public static void addScore(double score){
		score = score+score;
		System.out.println("addScore_score:"+score);
	}
	
	public static void editStudent(Student student){
		student.name = "jack";
		student.age = 15;
	}
	
	public static void swap(Student student1,Student student2){
		Student temp = student1;
		student1 = student2;
		student2 = temp;
	}
	
	public static void main(String[] args) {
		Student student1 = new Student();
		Student student2 = new Student();
		student1.name = "syudent1";
		student1.age = 15;
		student2.name = "syudent2";
		student2.age = 18;
		swap(student1, student2);
		System.out.println("student1:"+student1);
		System.out.println("student2:"+student2);
	}

}

运行结果:student1和student2并没有交换对象,因为方法传递的是拷贝引用,在方法内引用交换了互相指向的对象,但是方法结束后两个变量就销毁了,并没有改变main中student1和student2引用的对象。

student1:Student [sid=2, name=syudent1, score=0.0, age=15]
student2:Student [sid=3, name=syudent2, score=0.0, age=18]

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值