Java 方法参数
来源:互联网 发布:视频分析软件 编辑:程序博客网 时间:2024/06/08 08:08
Java 程序设计语言总是采用按值调用。也就是说,方法得到的是所有参数值的一个拷贝,特别是,方法不能修改传递给它的任何参数的内容。
例如,下面的调用:
double percent = 10;harry.raiseSalary(percent);在方法调用之后,percent的值还是10。代码如下:
public class ParamTest {public static void main(String [] args){System.out.println("Testing tripleValue:");double percent = 10;System.out.println("Before:percent=" + percent);tripleValue(percent);System.out.println("After:percent=" + percent);}public static void tripleValue(double x){ x = 3*x; System.out.println("End of method: x="+x);}}
运行结果:
可以看到,无论怎样,调用这个方法之后,percent的值还是10。看一下具体的执行过程:
1)x被初始化为percent值的一个拷贝(也就是10)。
2)x被乘以3后等于30。但是percent仍然是10。
3)这个方法结束之后,参数变量x不再使用。
方法参数共有两种类型:
1、基本数据类型(数字、布尔值)。
2、对象引用。
我已经知道,一个方法不可能修改一个基本数据类型的参数。而对象引用作为参数就不一样了,可以利用下面这个方法实现将一个雇员是的薪金提高两倍的操作:
public static void tripleSalary(Employee x){ x.raiseSalary(200);}具体代码:
public class ParamTest {public static void main(String [] args){System.out.println("\nTesting tripleSalary:");Employee harry = new Employee("Harry",50000);System.out.println("Before: salary=" + harry.getSalary());tripleSalary(harry);System.out.println("After: salary=" + harry.getSalary());}public static void tripleSalary(Employee x){x.raiseSalary(200);System.out.println("End of method: salary=" + x.getSalary());}}public class Employee {private String name;private double salary;public Employee(String n,double s){name = n;salary = s;}public String getName() {return name;}public double getSalary() {return salary;} public void raiseSalary(double byPercent){ double raise = salary*byPercent/100; salary+=raise; }}运行结果:
具体执行过程:
1、x被初始化为harry值的拷贝,这里是个对象的引用。
2、raiseSalary方法应用于这个对象引用。x和harry同时引用的那个Employee对象的薪金提高了200%。
3、方法结束后,参数变量x不再使用。当然,对象变量harry继续引用那个薪金增至3倍的雇员对象。
由上可知,实现一个改变对象参数状态的方法并不是一件难事。因为,方法得到的是对象引用的拷贝,对象引用及其他的拷贝同时引用统一个对象。
很多程序设计语言提供了两种参数传递的方式:值调用和引用调用。有些人认为Java程序设计语言对对象采用的是引用调用,实际上,这种理解是不对的。由于这种理解有一定的普遍性,所以下面给出一个范反例来详细阐述。
首先,编写一个交换两个雇员对象的方法:
public static void swap(Employee x,Employee y){ Employee temp=x; x = y; y = temp;}
如果Java设计语言对对象采用的是引用调用,这个方法就应该能够实现交换数据的效果:
Emloyee a = new Emloyee("Alice",...);Emloyee a = new Emloyee("Bob",...);swap(a,b);但是,方法并没有改变存储在变量a和b的对象引用。swap方法的参数x和y被初始化为两个对象引用的拷贝,这个方法交换的是这两个拷贝。具体代码:
public class Ey {public static void swap(Employee x,Employee y){Employee temp = x;x = y;y = temp;System.out.println("End of method: x="+x.getName());System.out.println("End of method: y="+y.getName());}public static void main(String [] args){Employee a = new Employee("Alice",200);Employee b = new Employee("Bob",400);System.out.println("\nTesting swap:");System.out.println("Before:a=" + a.getName());System.out.println("Before:b=" + b.getName());swap(a,b);System.out.println("After:a=" + a.getName());System.out.println("After:b=" + b.getName());}}public class Employee {private String name;private double salary;public Employee(String n,double s){name = n;salary = s;}public String getName() {return name;}public double getSalary() {return salary;} public void raiseSalary(double byPercent){ double raise = salary*byPercent/100; salary+=raise; }}
运行结果:
最终,白费力气。在方法结束时参数变量x和y被丢弃了。原来的变量a和b仍然引用这个方法调用之前所引用的对象
这个过程说明:Java程序设计语言对对象采用的不是引用调用,实际上,对象引用进行的是值传递。
下面总结一下Java程序设计语言中方法参数的使用情况:
1、一个方法不能修改一个基本数据类型的参数(即数值型和布尔型)。
2、一个方法可以改变一个对象参数的状态。
3、一个方法不能让对象参数引用一个新的对象。
- java方法参数传递
- java 可变参数方法
- JAVA 参数传方法
- Java多参数方法
- Java方法参数传递
- Java方法输出参数
- java方法参数
- JAVA 可变参数方法
- Java 方法参数传递
- java方法参数
- java可变参数方法
- java 方法可变参数
- Java可变参数方法
- Java方法参数传递
- Java之方法参数
- Java方法参数
- Java可变参数方法
- Java方法参数传递
- LeetCode--Count Primes(素数个数)Python
- 笔记本扬声器无声音,必须断电重启问题
- 操作系统的堆和栈的区别
- 109. Convert Sorted List to Binary Search Tree
- 转载:JAVA基础编程练习题--50道
- Java 方法参数
- 软件架构师的12项修炼——关系技能修炼(1)
- Shell命令行处理JSON
- sublime 命令行直接调用
- 查找之索引查找
- prompt(1) to win writeup
- 在C语言中为什么scanf输入语句,要在变量名前加&呢?
- 无法启动此程序,因为计算机中丢失MSVCRTD.dll(MFC42D.dll, MFCO42D.dll)
- Ubuntu16.04LTS+CUDA8.0+cuDNN5.1+Anaconda3(python3.6)+tensorflow_gpu-1.2.1安装过程全记录