零基础学Java(13)方法参数[通俗易懂]

零基础学Java(13)方法参数[通俗易懂]前言首先回顾一下在程序设计语言中关于如何将参数传递给方法的一些专业术语。按值调用表示方法接收的是调用者提供的值。而按引调用表示方法接收的是调用者提供的变量地址。方法可以修改按引用传递的变量的值,而不

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

前言

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

Java传参

Java程序设计语言总是采用按值调用。也就是说,方法得到的是所有参数值的一个副本。具体来讲,方法不能修改传递给它的任何参数变量的内容。
接下来,假定一个方法试图将一个参数值增加至3倍:

public static void tripleValue(double x) {
    x = 3 * x;
}

然后调用下面这个方法

double percent = 10;
tripleValue(percent);

不过这样并不能起作用。调用这个方法之后,percent的值还是10。具体的执行过程如下:

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

然而,有两种类型的方法参数:

  • 基本数据类型(数字、布尔值)。
  • 对象引用

我们已经知道,一个方法不可能修改基本数据类型的参数,而对象引用作为参数就不同了,可以很容易得利用下面这个方法将一个员工的工资增至三倍:

public static void tripleSalary(Employee x) {
    x.raiseSalary(200);
}

  当调用

harry = new Employee(...);
tripleSalary(harry);

时,具体的执行过程为:

  1. x初始化为harry值的一个副本,这里就是一个对象引用。
  2. raiseSalary方法应用与这个对象引用。x和harry同时引用的那个Employee对象的工资提高了200%。
  3. 方法结束后,参数变量x不再使用。当然,对象变量harry继续引用那个工资增至3倍的员工对象。

可以看到,实现一个改变对象参数状态的方法是完全可以的,实际上也相当常见。理由很简单,方法得到的是对象引用的副本,原来的对象引用和这个副本都引用同一个对象。

总结
总结一下在Java中对方法参数能做什么和不能做什么:

  • 方法不能修改基本数据类型的参数(即数值型和布尔型)
  • 方法可以改变对象参数的状态
  • 方法不能让一个对象参数引用一个新的对象

 

实战例子

public class 方法参数 {
    public static void main(String[] args) {
        /*
         * 测试1:方法不能修改基本数据类型的参数
         * */
        System.out.println("测试tripleValue:");
        double percent = 10;
        System.out.println("之前:percent=" + percent);
        tripleValue(percent);
        System.out.println("之后:percent=" + percent);

        /*
         * 测试2:方法可以改变对象参数的状态
         * */
        System.out.println("\nTesting tripleSalary");
        Emplpoyee harry = new Emplpoyee("Harry", 50000);
        System.out.println("之前:salary=" + harry.getSalary());
        tripleSalary(harry);
        System.out.println("之后:salary=" + harry.getSalary());

        /*
         * 测试3:方法不能让一个对象参数引用一个新的对象
         * */
        System.out.println("\nTesting swap:");
        Emplpoyee a = new Emplpoyee("Alice", 70000);
        Emplpoyee b = new Emplpoyee("Bob", 60000);
        System.out.println("之前:a=" + a.getName());
        System.out.println("之前:b=" + b.getName());
        swap(a, b);
        System.out.println("之后:a=" + a.getName());
        System.out.println("之后:b=" + b.getName());
    }

    public static void tripleValue(double x) {
        x = 3 * x;
        System.out.println("方法结束后:x=" + x);
    }
    
    public static void tripleSalary(Emplpoyee x) {
        x.raiseSalary(200);
        System.out.println("方法结束后:salary=" + x.getSalary());
    }
    
    public static void swap(Emplpoyee x, Emplpoyee y) {
        Emplpoyee temp = x;
        x = y;
        y = temp;
        System.out.println("方法结束后:x=" + x.getName());
        System.out.println("方法结束后:y=" + y.getName());
    }
};


class Emplpoyee {
    private String name;
    private double salary;
    
    public Emplpoyee(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;
    }
}

运行结果如下:

测试tripleValue:
之前:percent=10.0
方法结束后:x=30.0
之后:percent=10.0

Testing tripleSalary
之前:salary=50000.0
方法结束后:salary=150000.0
之后:salary=150000.0

Testing swap:
之前:a=Alice
之前:b=Bob
方法结束后:x=Bob
方法结束后:y=Alice
之后:a=Alice
之后:b=Bob
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/165324.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 重装系统error16_error怎么解决

    重装系统error16_error怎么解决 初看这个错误,让我有点头大,因为我用客户端调用,它竟然告诉我服务器拒绝接收.上网上看了很多资料(90%是英文).各说其词,结果还是无果而终.终于功夫不负有心人,终于在不经意间看到了一个老外的陈词: packagecn.sss_grid.mis.action.gydq.service.client;//importcom.sss.util.JDom;importjava.

    2022年9月13日
    0
  • 模板字符串拼接html标签_标签当成字符串了

    模板字符串拼接html标签_标签当成字符串了本文实例讲述了ES6模板字符串和标签模板的应用。分享给大家供大家参考,具体如下:ES6中对字符串进行了扩展,而模板字符串就是一个非常实用的方式,可以在html中实现与变量和方法的混编之前我们手动拼接字符串的方式lethello=’Hello’;lethtml=”+”+hello+”+”;console.log(html);//HelloES6中使用模板字符串来优化…

    2022年8月21日
    30
  • T-SQL教程_sql server 2008使用

    T-SQL教程_sql server 2008使用文章目录T-SQL基础技术基本语法格式代码准备:(可以按照我的实例自行建立数据库)1、投影查询a、投影指定的列b、投影全部列c、修改查询结果的列标题d、去掉重复行2、选择查询a.表达式比较b.范围比较c.模式匹配d.空值使用代码示例:3、连接查询a.连接谓词b.以JOIN关键字指定的连接(1)内连接(2)外连接4、统计计算5、排序查询6、子查询T-SQL基础技术T-SQL语言中最重要的部分是它…

    2022年8月18日
    4
  • jQuery漂亮图标的垂直导航菜单

    效果展示 http://hovertree.com/texiao/nav/3/jQuery漂亮图标的垂直导航菜单 是一款当鼠标滑过菜单项时,会有一个背景遮罩层跟着鼠标移动,效果非常

    2021年12月27日
    46
  • 获取A股行情数据方法[通俗易懂]

    做股票量化分析,获取股票行情数据是第一步,结合网上的信息,和我用过的一些东西,做个总结。以后有新信息,逐步完善。一、tushare库网址:https://tushare.pro/常用apidf1=pro.trade_cal(exchange=‘SSE’,start_date=sdate,end_date=edate,is_open=‘1’)df=pro.daily(trade_…

    2022年4月10日
    501
  • 有监督学习、无监督学习以及半监督学习详解

    有监督学习、无监督学习以及半监督学习详解相信大家在开始学习机器学习的入门时,首先接触的概念就是监督学习、无监督学习以及半监督学习。在我们开始讲解之前,我们先回顾一下什么是机器学习(ML)?百度百科给出的定义是,机器学习是一门多学科交叉专业,涵盖概率论知识,统计学知识,近似理论知识和复杂算法知识,使用计算机作为工具并致力于真实实时的模拟人类学习方式,并将现有内容进行知识结构划分来有效提高学习效率。从定义中,我们可以发现:(1)机器学习是一门人工智能的科学,该领域的主要研究对象是人工智能,特别是如何在经验学习中改善具体算法…

    2022年5月28日
    46

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号