【JAVA】方法的使用

        上一篇我们讲述了程序相关逻辑控制,这节我们来说说方法的使用。

1. 方法概念及使用

1.1 什么是方法(method)

方法就是一个代码片段. 类似于 C 语言中的 "函数"。方法存在的意义(不要背, 重在体会):

  1. 是能够模块化的组织代码(当代码规模比较复杂的时候).
  2. 做到代码被重复使用, 一份代码可以在多个位置使用.
  3. 让代码更好理解更简单.
  4. 直接调用现有方法开发, 不必重复造轮子.

比如:现在要开发一款日历,在日历中经常要判断一个年份是否为闰年,则有如下代码:

int year = 1900;
if((0 == year % 4 && 0 != year % 100) || 0 == year % 400){System.out.println(year+"年是闰年");
}else{System.out.println(year+"年不是闰年");
}

那方法该如何来定义呢?

1.2 方法定义

方法语法格式

// 方法定义
修饰符 返回值类型 方法名称([参数类型 形参 ...]){方法体代码;[return 返回值];
}

示例一:实现一个函数,检测一个年份是否为闰年

public class Method{// 方法定义public static boolean isLeapYear(int year){if((0 == year % 4 && 0 != year % 100) || 0 == year % 400){return true;}else{return false;}}
}

示例二: 实现一个两个整数相加的方法

public class Method{// 方法的定义public static int add(int x, int y) {return x + y;}
}

【注意事项】

  1. 修饰符:现阶段直接使用public static 固定搭配
  2. 返回值类型:如果方法有返回值,返回值类型必须要与返回的实体类型一致,如果没有返回值,必须写成void
  3. 方法名字:采用小驼峰命名
  4. 参数列表:如果方法没有参数,()中什么都不写,如果有参数,需指定参数类型,多个参数之间使用逗号隔开
  5. 方法体:方法内部要执行的语句
  6. 在java当中,方法必须写在类当中
  7. 在java当中,方法不能嵌套定义
  8. 在java当中,没有方法声明一说

1.3 方法调用的执行过程

【方法调用过程】

调用方法--->传递参数--->找到方法地址--->执行被调方法的方法体--->被调方法结束返回--->回到主调方法继续往下执行

【注意事项】

  • 定义方法的时候, 不会执行方法的代码. 只有调用的时候才会执行
  • 一个方法可以被多次调用.

1.4 实参和形参的关系(重要)

方法的形参相当于数学函数中的自变量,比如:1 + 2 + 3 + … + n的公式为sum(n) =

        Java中方法的形参就相当于sum函数中的自变量n,用来接收sum函数在调用时传递的值的。形参的名字可以随意取,对方法都没有任何影响,形参只是方法在定义时需要借助的一个变量,用来保存方法在调用时传递过来的值。

public static int getSum(int N){ // N是形参return (1+N)*N / 2;
} getSum(10); // 10是实参,在方法调用时,形参N用来保存10
getSum(100); // 100是实参,在方法调用时,

注意:在Java中,实参的值永远都是拷贝到形参中,形参和实参本质是两个实体

代码示例: 交换两个整型变量

public class TestMethod {public static void main(String[] args) {int a = 10;int b = 20;swap(a, b);System.out.println("main: a = " + a + " b = " + b);}public static void swap(int x, int y) {int tmp = x;x = y;y = tmp;System.out.println("swap: x = " + x + " y = " + y);}
} // 运行结果
swap: x = 20 y = 10
main: a = 10 b = 20

可以看到,在swap函数交换之后,形参x和y的值发生了改变,但是main方法中a和b还是交换之前的值,即没有交换成功。

【原因分析】

实参a和b是main方法中的两个变量,其空间在main方法的栈(一块特殊的内存空间)中,而形参x和y是swap方法中的两个变量,x和y的空间在swap方法运行时的栈中,因此:实参a和b 与 形参x和y是两个没有任何关联性的变量,在swap方法调用时,只是将实参a和b中的值拷贝了一份传递给了形参x和y,因此对形参x和y操作不会对实参a和b产生任何影响。

注意:对于基础类型来说, 形参相当于实参的拷贝. 即 传值调用
 

int a = 10;
int b = 20;int x = a;
int y = b;int tmp = x;
x = y;
y = tmp;

 可以看到, 对 x 和 y 的修改, 不影响 a 和 b.

【解决办法】: 传引用类型参数 (例如数组来解决这个问题)

public class TestMethod {public static void main(String[] args) {int[] arr = {10, 20};swap(arr);System.out.println("arr[0] = " + arr[0] + " arr[1] = " + arr[1]);}public static void swap(int[] arr) {int tmp = arr[0];arr[0] = arr[1];arr[1] = tmp;}
} // 运行结果
arr[0] = 20 arr[1] = 10

1.5 没有返回值的方法

方法的返回值是可选的. 有些时候可以没有的,没有时返回值类型必须写成void

代码示例

class Test {public static void main(String[] args) {int a = 10;int b = 20;print(a, b);}public static void print(int x, int y) {System.out.println("x = " + x + " y = " + y);}
}

另外, 如刚才的交换两个整数的方法, 就是没有返回值的.

2. 方法重载

2.1 为什么需要方法重载

public class TestMethod {public static void main(String[] args) {int a = 10;int b = 20;int ret = add(a, b);System.out.println("ret = " + ret);double a2 = 10.5;double b2 = 20.5;double ret2 = add(a2, b2);System.out.println("ret2 = " + ret2);}public static int add(int x, int y) {return x + y;}
} // 编译出错
Test.java:13: 错误: 不兼容的类型: 从double转换到int可能会有损失
double ret2 = add(a2, b2);^

由于参数类型不匹配, 所以不能直接使用现有的 add 方法.一种比较简单粗暴的解决方法如下:

public class TestMethod {public static void main(String[] args) {int a = 10;int b = 20;int ret = addInt(a, b);System.out.println("ret = " + ret);double a2 = 10.5;double b2 = 20.5;double ret2 = addDouble(a2, b2);System.out.println("ret2 = " + ret2);}public static int addInt(int x, int y) {return x + y;}public static double addDouble(double x, double y) {return x + y;}
}

上述代码确实可以解决问题,但不友好的地方是:需要提供许多不同的方法名,而取名字本来就是让人头疼的事情。那能否将所有的名字都给成 add 呢?

2.2 方法重载概念

        在自然语言中,一个词语如果有多重含义,那么就说该词语被重载了,具体代表什么含义需要结合具体的场景。在Java中方法也是可以重载的。

在Java中,如果多个方法的名字相同,参数列表不同,则称该几种方法被重载了
 

public class TestMethod {public static void main(String[] args) {add(1, 2); // 调用add(int, int)add(1.5, 2.5); // 调用add(double, double)add(1.5, 2.5, 3.5); // 调用add(double, double, double)}public static int add(int x, int y) {return x + y;}public static double add(double x, double y) {return x + y;}public static double add(double x, double y, double z) {return x + y + z;}
}

注意:

  1. 方法名必须相同
  2. 参数列表必须不同(参数的个数不同、参数的类型不同、类型的次序必须不同)
  3. 与返回值类型是否相同无关
  4. // 注意:两个方法如果仅仅只是因为返回值类型不同,是不能构成重载的
    public class TestMethod {public static void main(String[] args) {int a = 10;int b = 20;int ret = add(a, b);System.out.println("ret = " + ret);}public static int add(int x, int y) {return x + y;}public static double add(int x, int y) {return x + y;}
    } // 编译出错
    Test.java:13: 错误: 已在类 Test中定义了方法 add(int,int)
    public static double add(int x, int y) {^
    1 个错误

  5. 编译器在编译代码时,会对实参类型进行推演,根据推演的结果来确定调用哪个方法

2.3 方法签名

        在同一个作用域中不能定义两个相同名称的标识符。比如:方法中不能定义两个名字一样的变量,那为什么类中就可以定义方法名相同的方法呢?

        方法签名即:经过编译器编译修改过之后方法最终的名字。具体方式:方法全路径名+参数列表+返回值类型,构成方法完整的名字

public class TestMethod {public static int add(int x, int y){return x + y;}public static double add(double x, double y){return x + y;}public static void main(String[] args) {add(1,2);add(1.5, 2.5);}
}

        结束喽,下节开始递归等知识点的讲解,感谢各位友友的支持。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/11343.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UKP3d,修改管道长度或标高的方法

南京用户问,请问这个起末点标高可以修改么?如图: 上述起末点的标高是不可以修改,用户没有详细阐述自已想要的结果。可能是以下几种场景,希望能帮助到用户: 1.修改管道长度: 1.1.(管道在模型的…

APP反抓包 - 客户端证书验证

一,校验的原理 下图为HTTP协议的请求过程:传输过程中都是明文数据 下图为HTTPS协议的请求过程: 注意:公钥加密的数据只能通过对应的私钥才能解密,就算是进行加密的公钥也不能进行解密。 上述的请求过程看似复杂,实际就是两部分: 通过公钥与私钥同步对称密钥使用对…

【C++】优先级队列与仿函数

🔥个人主页:北辰水墨 🔥专栏:C学习仓 本节内容我们来讲解优先级队列和仿函数。文中会附上优先级队列模拟实现的源码。 注意:本节我会把最大优先级队列和大堆名词混着用,他们两个本质是一样的。 一、priori…

Java并发编程:Thread原理解析和协程介绍

文章目录 一、java中的thread和操作系统中的Thread对应关系二、协程 一、java中的thread和操作系统中的Thread对应关系 在java中用户线程和内核线程是1:1的形式: 其中java层面创建的线程为用户线程,其对应的底层线程为内核线程。 Java生成线程的流程如…

使用GitLab自带的CI/CD功能在本地部署.Net8项目(二)

前置内容: 通过Docker Compose部署GitLab和GitLab Runner(一) 目录 一、创建代码仓库 二、创建GitLabRunner 三、注册Runner 四、配置Runner,绑定宿主Docker 五、创建.Net8WebApi项目进行测试 六、总结 一、创建代码仓库 …

【Redis7】10大数据类型之Stream类型

文章目录 1. Stream简介2. 生产消息命令(XADD)3. 查询相关命令3.1 获取指定范围内的消息(XRANGE)3.2 逆序获取指定范围内的消息(XREVRANGE)3.3 返回消息的数量(XLEN) 4. 删除消息命令(XDEL)5. 截取消息命令(XTRIM)6. 消费消息命令(XREAD)7. 消费者组管理命令7.1 创建消费者组(X…

考研数学|24像张宇那样的题?李林880和李永乐660不够用了?

以前的卷子就不说了,就说说最近的24年的考研数学题 24年考研数学真题评价: 首先数学二在计算量上超过了数学三,尤其是在高等数学的选择题部分,这使得数学二的难度可能略高于数学三,尽管两者之间并没有本质的差异。与…

【基础绘图】 10.饼图

效果图: 主要步骤: 1. 数据准备:自己赋值的随机数 2. 图像绘制:绘制饼图 详细代码:着急的直接拖到最后有完整代码 步骤一:导入库包及图片存储路径并设置中文字体为宋体,西文为新罗马&#…

java项目之车辆管理系统(springboot+vue+mysql)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的车辆管理系统。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 车辆管理系统的主要使用者分…

【Unity UI系统介绍】

Unity UI系统介绍 想了解更多游戏开发知识,可以扫描下方二维码,免费领取游戏开发4天训练营课程 Unity UI 是 Unity 引擎中的一套用户界面(UI)系统,允许开发者创建和管理游戏的用户界面。 Canvas:Canvas 是 Unity UI 的核心组件…

零基础又怎样?教你这样高效拿下HCIE!

HCIE认证是网络技术领域内权威的认证之一,对于零基础的学员来说,这似乎是一项几乎不可能完成的任务,很多人想转行都望而却步。 然而,只要策略得当,零基础的学员同样可以高效地迈向HCIE的殿堂。 今天就聊聊&#xff0…

CAD绘制3维场景图记录

文章目录 1.给三维体每个面上不同的颜色1.1 软件设置1.2 着色面 2.在长方体上画圆柱体 1.给三维体每个面上不同的颜色 1.1 软件设置 这里必须改为真实,否则之后的面上色只能显示更改了线条颜色 1.2 着色面 如果你菜单栏没有显示,在上面小倒三角那里…

windows@注册表介绍@注册表的查看和编辑操作

文章目录 abstractrefs注册表的主要组件包括根键极其缩写名称👺子键特性 查看注册表👺使用powershell查看路径下的子路径声明概念Get-ChildItem查看注册表路径下的项Set-Location进入注册表路径举例说明查看文件系统某个路径下的项查看某个注册表路径的项…

图和网络笔记

文章目录 1. A X 0 AX0 AX02. A T Y 0 A^TY0 ATY03. A X 0 AX0 AX0和 A T Y 0 A^TY0 ATY0的关系 1. A X 0 AX0 AX0 一个图可以由节点和边组成,假设我们有一个节点notes :n4,边edges:m5的有向图,表示如下 通过以上电路…

Pycharm使用Anaconda虚拟环境

一、前置 安装 Pychram安装 Anaconda,并配置虚拟环境 参考: Anaconda虚拟环境 anaconda虚拟环境pytorch安装 二、在Pycharm中使用Anaconda的虚拟环境 打开 Pycharm的命令行可以看到 Anaconda 的虚拟环境已经启动。 三、问题集合 (1&…

多模态产品在智能文档处理应用的展望------以TextIn模型为例

前言发展现状TextIn 文档解析技术文本向量化展望合合信息 前言 第十四届视觉与学习青年学者研讨会(VALSE 2024)于5月5日-7日在山城重庆渝北区悦来国际会议中心举办。大会聚焦计算机视觉、模式识别、多媒体和机器学习等领域的国际前沿和热点方向。大会中,合合信息智能…

限流算法(令牌桶漏桶计数器)

📝个人主页:五敷有你 🔥系列专栏:Spring⛺️稳中求进,晒太阳 业务重的三种情况:突发流量、恶意流量、业务本身需要 限流: 是为了保护自身系统和下游系统不被高并发流量冲垮,导致系统雪崩…

数据中心--AI时代的“炼油厂”

数据中心正在成为AI时代的“炼油厂”! 众所周知,AI的高歌猛进催生了对数据的海量处理需求。为了满足蓬勃的算力需求,全球开启了新一轮的数据中心建设热潮,数据中心业务正在以指数级的速度疯狂扩张。 此番情景,和第二…

Git系列:git grep 被忽视的操作细节

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

java面试题(常见集合)

算法复杂度分析 时间复杂度分析 时间复杂度分析:来评估代码的执行耗时的 大O表示法:不具体表示代码真正的执行时间,而是表示代码执行时间随数据规模增长的变化趋势 空间复杂度 空间复杂度的全称是渐进空间复杂度,表示算法占用…