零基础学Java(13)方法参数
前言
首先回顾一下在程序设计语言中关于如何将参数传递给方法的一些专业术语。按值调用表示方法接收的是调用者提供的值。而按引调用表示方法接收的是调用者提供的变量地址。方法可以修改按引用传递的变量的值,而不能修改按值传递的变量的值。
Java传参
Java程序设计语言总是采用按值调用。也就是说,方法得到的是所有参数值的一个副本。具体来讲,方法不能修改传递给它的任何参数变量的内容。
接下来,假定一个方法试图将一个参数值增加至3倍:
public static void tripleValue(double x) {
x = 3 * x;
}
然后调用下面这个方法
double percent = 10;
tripleValue(percent);
不过这样并不能起作用。调用这个方法之后,percent的值还是10。具体的执行过程如下:
- x初始化为percent值的一个副本(也就是10)。
- x乘以3以后等于30,但是percent仍然是10
- 这个方法结束之后,参数变量x不再使用。
然而,有两种类型的方法参数:
- 基本数据类型(数字、布尔值)。
- 对象引用
我们已经知道,一个方法不可能修改基本数据类型的参数,而对象引用作为参数就不同了,可以很容易得利用下面这个方法将一个员工的工资增至三倍:
public static void tripleSalary(Employee x) {
x.raiseSalary(200);
}
当调用
harry = new Employee(...);
tripleSalary(harry);
时,具体的执行过程为:
- x初始化为
harry值的一个副本,这里就是一个对象引用。 raiseSalary方法应用与这个对象引用。x和harry同时引用的那个Employee对象的工资提高了200%。- 方法结束后,参数变量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
零基础学Java(13)方法参数的更多相关文章
- 零基础学Java第三节(基本输入输出)
本篇文章是<零基础学Java>专栏的第三篇文章,文章采用通俗易懂的文字.图示及代码实战,从零基础开始带大家走上高薪之路! 本文章首发于公众号[编程攻略] Java程序的命令行参数 我们可以 ...
- 零基础学Java第五节(面向对象一)
本篇文章是<零基础学Java>专栏的第五篇文章,文章采用通俗易懂的文字.图示及代码实战,从零基础开始带大家走上高薪之路! 本文章首发于公众号[编程攻略] 类与对象 在哲学体系中,可以分为主 ...
- 零基础学Java第四节(字符串相关类)
本篇文章是<零基础学Java>专栏的第四篇文章,文章采用通俗易懂的文字.图示及代码实战,从零基础开始带大家走上高薪之路! String 本文章首发于公众号[编程攻略] 在Java中,我们经 ...
- 零基础学Java第六节(面向对象二)
本篇文章是<零基础学Java>专栏的第六篇文章,文章采用通俗易懂的文字.图示及代码实战,从零基础开始带大家走上高薪之路! 本文章首发于公众号[编程攻略] 继承 创建一个Person类 我们 ...
- 零基础学Java第一节(语法格式、数据类型)
本篇文章是<零基础学Java>专栏的第一篇文章,从本篇文章开始,将会连更本专栏,带领大家将Java基础知识彻底学懂,文章采用通俗易懂的文字.图示及代码实战,从零基础开始带大家走上高薪之路! ...
- 零基础学Java,PayPal技术专家手把手带你入门
在最权威的 TIOBE 编程语言排名榜单上,Java 常年稳居第一,可以说是世界上应用最为广泛的一门语言. 同时,在微服务.云计算.大数据.Android App 开发等领域,Java 也是当之无愧的 ...
- 零基础学Java第二节(运算符、输入、选择流程控制)
本篇文章是<零基础学Java>专栏的第二篇文章,文章采用通俗易懂的文字.图示及代码实战,从零基础开始带大家走上高薪之路! 第一章 运算符 1.1 算术运算符的概述和用法 运算符 对常量和变 ...
- 零基础学Java(1)初识Java程序
前言 就国内来说,Java毫无疑问是后端语言中的No.1没有之一,所以今天我们也来0基础学习Java!!! Java的好处(针对测试工程师) 面试加分->涨薪 大多数公司服务端用的都是Java, ...
- 零基础学Java之Java学习笔记(二):Java快速入门
提出要求: 开发一个 HelloWorld.java 程序,可以输出 "Hello,world!" 开发步骤: (1)将 Java 代码编写到扩展名为 HelloWorld.jav ...
随机推荐
- VMware 虚拟机图文安装和配置 AlmaLinux OS 8.6 教程
前言: 这是<VMware 虚拟机图文安装和配置 Rocky Linux 8.5 教程>一文的姐妹篇教程,如果你需要阅读它,请点击这里. 2020 年,CentOS 宣布:计划未来将重心从 ...
- 渗透:Nmap
Nmap,也就是Network Mapper,最早是Linux下的网络扫描和嗅探工具包. nmap是一个网络连接端扫描软件,用来扫描网上电脑开放的网络连接端.确定哪些服务运行在哪些连接端,并且推断计算 ...
- 图解Dijkstra(迪杰斯特拉)算法+代码实现
简介 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra算法是很有代表性的 ...
- SQL中常用的字符串LEFT函数和RIGHT函数详解!
今天继续整理日常可能经常遇到的一些处理字符串的函数,记得点赞收藏!以备不时之需!看到最后有惊喜! LEFT(expression, length)函数 解析:从提供的字符串的左侧开始提取给定长度的字符 ...
- 122_Power Pivot&Power BI不连续日期的日环比
博客:www.jiaopengzi.com 焦棚子的文章目录 请点击下载附件 一.背景 这两天有朋友在交流,dax中使用时间智能函数写日环比,一个 dateadd 就可以了.但是有些业务不是每天都连续 ...
- [codeforces] 暑期训练之打卡题(一)
每个标题都做了题目原网址的超链接 Day1<Vanya and Lanterns> 题意: 一条长度为 l 的街道,在这条街道上放置了n个相同的灯,街道一端位置记为0,每个灯的位置在ai处 ...
- 深入解读SQL的聚集函数
摘要:本文从基本聚集操作入手,介绍常用的SQL语法,以及一些扩展的聚集功能,同时会讲到在GaussDB(DWS)里聚集相关的一些优化思路. 本文分享自华为云社区<GaussDB(DWS) SQL ...
- git实战-多分支开发-2022新项目
现在开发中大多数公司中都在使用Git这个代码版本管理工具,几乎可以说是已经成为标配,刚入职不久的这家新公司也不例外. 去公司没多久,开始搭建项目,然后创建开发分支,有多少个后端人员就创建多少个开发分支 ...
- ROS基本程序实现
0.前言 现在介绍ROS基本程序实现的教程有很多,步骤无非就是建工作空间,编译,创建功能包,创建文件和修改CMakeList,之后再编译.运行程序这几步.但是这些教程中很多在文件夹切换的很混乱,导致会 ...
- RocketMQ的基本使用
第一步导入依赖: <!--Springboot 集成 RocketMQ依赖--> <dependency> <groupId>org.apache.rocketmq ...