博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JAVA基础15——方法参数
阅读量:3965 次
发布时间:2019-05-24

本文共 3135 字,大约阅读时间需要 10 分钟。

 

一、基本概念

参数类型

  • 形参:方法被调用时需要传递进来的参数,例如:function(int a)中的a,他只有function被调用期间a才有意义,也就是被分配内存空间,在方法function方法被执行完后,a就会被销毁释放内存空间,也就不存在了。
  • 实参:方法被调用时传递进来的实际值,他在方法被调用前就已经被初始化,并且在方法被调用时传入。

值传递和引用传递

  • 值传递:在方法被调用时,实参通过把他的内容副本传入方法内部,此时形参接收的内容是实参的一个拷贝,因此在方法内对实参的任何操作,都仅仅是对这个内容的副本进行操作,不影响原初始值的内容。值传递传递的是一个真实内容的副本,对副本的操作不影响原内容,也就是形参怎么变化,不影响实参对应的内容。
  • 引用传递:"引用”也就是指向真实内容的地址值。在方法调用时,实参的地址通过方法调用被传递给相应的形参,在方法体内,形参和实参指向同一块内存地址,对形参的操作会影响原来的内容。

我们可以看一下代码:

public static void main(String[] args) {				String nameString = "张三";				name(nameString);				System.out.println("main--->"+nameString);	}		public static void name(String name) {		name = "李四";		System.out.println("name--->"+name);		}

 

这一次拷贝的是nameString 值"张三",name的值就是张三,所以当name的值不管怎么变化,nameString是不变的。

 

------------------------------------------------------------------------------------------------------------------------

那我们来看一下这个

public class Person {		private String nameString;		private int age;	public Person(String nameString,int age) {		this.age = age;		this.nameString = nameString;	}		@Override	public String toString() {		return "Person [nameString=" + nameString + ", age=" + age + "]";	}	public static void name(Person person) {		person.age =20;		person.nameString="李四";	}		public static void main(String[] args) {		Person person = new Person("张三",18);		System.out.println(person.toString()); //参数改变前		name(person);		System.out.println(person.toString()); // 参数改变后	}		}

输出答案

Person [nameString=张三, age=18]Person [nameString=李四, age=20]

 

这一次我们也是拷贝的是一个副本,拷贝的是person对象的副本,拷贝过来的对象和原对象指向同一内存的存储空间,所以当(person -- 拷贝)改变值的时候原person也改变值。

我们知道其实在栈内存当中原person里面存贮着堆内存当中的Person类的内存地址,而java在这里传输的是原person的存贮着的地址值

 

结论:java 只有值传递

 

public class Student {	private String name;	private int age;	public Student(String name,int age) {		this.name = name;		this.age = age;	}	@Override	public String toString() {		return "Student [name=" + name + ", age=" + age + "]";	}	public static Student change(Student s1, Student s2){		Student temp = new Student("王五",20);		temp = s1;		s1 = s2;		s2 = temp;		return temp;	}	public static void main(String[] args) {		Student zhangsan = new Student("张三", 18);		Student lisi = new Student("李四", 20);		Student tStudent = Student.change(zhangsan, lisi);		System.out.println(zhangsan.toString());		System.out.println(lisi.toString());	}	}
Student [name=张三, age=18]Student [name=李四, age=20]

--------------------------------------------------------------------------------------------------------------------------

public class Student {	private String name;	private int age;	public Student(String name,int age) {		this.name = name;		this.age = age;	}	@Override	public String toString() {		return "Student [name=" + name + ", age=" + age + "]";	}	public static void change(Student s1, Student s2){		Student temp = new Student("王五",20);		temp.name = s1.name;		s1.name = s2.name;		s2.name = temp.name;			}	public static void main(String[] args) {		Student zhangsan = new Student("张三", 18);		Student lisi = new Student("李四", 20);		Student.change(zhangsan, lisi);		System.out.println(zhangsan.toString());		System.out.println(lisi.toString());	}	}

 

Student [name=李四, age=18] Student [name=张三, age=20]

 

 

转载地址:http://rcyki.baihongyu.com/

你可能感兴趣的文章
软件设计
查看>>
程序编码
查看>>
软件测试
查看>>
软件维护
查看>>
软件项目管理
查看>>
面向过程的分析方法
查看>>
软件设计基础
查看>>
Hibernate性能优化
查看>>
Spring核心ioc
查看>>
SSH框架总结(框架分析+环境搭建+实例源码下载)
查看>>
Struts2+Spring3+Mybatis3开发环境搭建
查看>>
mongoDB入门必读(概念与实战并重)
查看>>
通俗易懂解剖jbpm4
查看>>
rsync
查看>>
makefile
查看>>
linux 文件权限
查看>>
一些比较好的golang安全项目
查看>>
HTTP状态码
查看>>
go语言
查看>>
mysql mariaDB 以及存储引擎
查看>>