零基础学Java(13)方法参数

打印 上一主题 下一主题

主题 550|帖子 550|积分 1650

前言

首先回顾一下在程序设计语言中关于如何将参数传递给方法的一些专业术语。按值调用表示方法接收的是调用者提供的值。而按引调用表示方法接收的是调用者提供的变量地址。方法可以修改按引用传递的变量的值,而不能修改按值传递的变量的值。
 
Java传参

Java程序设计语言总是采用按值调用。也就是说,方法得到的是所有参数值的一个副本。具体来讲,方法不能修改传递给它的任何参数变量的内容。
接下来,假定一个方法试图将一个参数值增加至3倍:
  1. public static void tripleValue(double x) {
  2.     x = 3 * x;
  3. }
复制代码
然后调用下面这个方法
  1. double percent = 10;
  2. tripleValue(percent);
复制代码
不过这样并不能起作用。调用这个方法之后,percent的值还是10。具体的执行过程如下:

  • x初始化为percent值的一个副本(也就是10)。
  • x乘以3以后等于30,但是percent仍然是10
  • 这个方法结束之后,参数变量x不再使用。
然而,有两种类型的方法参数:

  • 基本数据类型(数字、布尔值)。
  • 对象引用
我们已经知道,一个方法不可能修改基本数据类型的参数,而对象引用作为参数就不同了,可以很容易得利用下面这个方法将一个员工的工资增至三倍:
  1. public static void tripleSalary(Employee x) {
  2.     x.raiseSalary(200);
  3. }
复制代码
  当调用
  1. harry = new Employee(...);
  2. tripleSalary(harry);
复制代码
时,具体的执行过程为:

  • x初始化为harry值的一个副本,这里就是一个对象引用。
  • raiseSalary方法应用与这个对象引用。x和harry同时引用的那个Employee对象的工资提高了200%。
  • 方法结束后,参数变量x不再使用。当然,对象变量harry继续引用那个工资增至3倍的员工对象。
可以看到,实现一个改变对象参数状态的方法是完全可以的,实际上也相当常见。理由很简单,方法得到的是对象引用的副本,原来的对象引用和这个副本都引用同一个对象。
总结
总结一下在Java中对方法参数能做什么和不能做什么:

  • 方法不能修改基本数据类型的参数(即数值型和布尔型)
  • 方法可以改变对象参数的状态
  • 方法不能让一个对象参数引用一个新的对象
 
实战例子
  1. public class 方法参数 {
  2.     public static void main(String[] args) {
  3.         /*
  4.          * 测试1:方法不能修改基本数据类型的参数
  5.          * */
  6.         System.out.println("测试tripleValue:");
  7.         double percent = 10;
  8.         System.out.println("之前:percent=" + percent);
  9.         tripleValue(percent);
  10.         System.out.println("之后:percent=" + percent);
  11.         /*
  12.          * 测试2:方法可以改变对象参数的状态
  13.          * */
  14.         System.out.println("\nTesting tripleSalary");
  15.         Emplpoyee harry = new Emplpoyee("Harry", 50000);
  16.         System.out.println("之前:salary=" + harry.getSalary());
  17.         tripleSalary(harry);
  18.         System.out.println("之后:salary=" + harry.getSalary());
  19.         /*
  20.          * 测试3:方法不能让一个对象参数引用一个新的对象
  21.          * */
  22.         System.out.println("\nTesting swap:");
  23.         Emplpoyee a = new Emplpoyee("Alice", 70000);
  24.         Emplpoyee b = new Emplpoyee("Bob", 60000);
  25.         System.out.println("之前:a=" + a.getName());
  26.         System.out.println("之前:b=" + b.getName());
  27.         swap(a, b);
  28.         System.out.println("之后:a=" + a.getName());
  29.         System.out.println("之后:b=" + b.getName());
  30.     }
  31.     public static void tripleValue(double x) {
  32.         x = 3 * x;
  33.         System.out.println("方法结束后:x=" + x);
  34.     }
  35.    
  36.     public static void tripleSalary(Emplpoyee x) {
  37.         x.raiseSalary(200);
  38.         System.out.println("方法结束后:salary=" + x.getSalary());
  39.     }
  40.    
  41.     public static void swap(Emplpoyee x, Emplpoyee y) {
  42.         Emplpoyee temp = x;
  43.         x = y;
  44.         y = temp;
  45.         System.out.println("方法结束后:x=" + x.getName());
  46.         System.out.println("方法结束后:y=" + y.getName());
  47.     }
  48. };
  49. class Emplpoyee {
  50.     private String name;
  51.     private double salary;
  52.    
  53.     public Emplpoyee(String n, double s) {
  54.         name = n;
  55.         salary = s;
  56.     }
  57.    
  58.     public String getName() {
  59.         return name;
  60.     }
  61.    
  62.     public double getSalary() {
  63.         return salary;
  64.     }
  65.    
  66.     public void raiseSalary(double byPercent) {
  67.         double raise = salary * byPercent / 100;
  68.         salary += raise;
  69.     }
  70. }
复制代码
运行结果如下:
  1. 测试tripleValue:
  2. 之前:percent=10.0
  3. 方法结束后:x=30.0
  4. 之后:percent=10.0
  5. Testing tripleSalary
  6. 之前:salary=50000.0
  7. 方法结束后:salary=150000.0
  8. 之后:salary=150000.0
  9. Testing swap:
  10. 之前:a=Alice
  11. 之前:b=Bob
  12. 方法结束后:x=Bob
  13. 方法结束后:y=Alice
  14. 之后:a=Alice
  15. 之后:b=Bob
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

滴水恩情

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表