java中方法的使用

方法的使用

  • 方法的概念
    • 什么是方法
    • 方法定义
    • 方法的调用过程
    • 实参和形参的关系
  • 方法重载
    • 为什么需要方法重载
    • 方法重载的概念
    • 方法签名
  • 递归
    • 递归的概念
    • 递归过程分析
    • 递归练习

方法的概念

什么是方法

方法就是一个代码片段,类似于C语言的函数。
方法存在的意义:

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

方法定义

语法格式:

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

例子1:实现一个函数,用于检测年份是否为闰年

public static boolean isLeapYear(int year){if ((year % 400 == 0) || ((year % 100 != 0) && (year % 4 == 0))){return true;}return false;}
public static void main(String[] args) {int year = 2023;if (isLeapYear(year)){System.out.println("是闰年");}else{System.out.println("不是闰年");}}

注意:

  • 返回值类型:如果方法有返回值,返回值类型必须要与返回的实体类型一致,如果没有返回值,必须写成void
  • 方法名字:采用小驼峰命名(首个单词的首个字母小写,后续单词首字母大写)
  • 参数列表:如果方法没有参数。()中什么都不写,如果有参数,需指定参数类型,多个参数之间用逗号隔开
  • 方法体:方法内部要执行的语句
  • 在java当中,方法必须写在类当中
  • 在java中,方法不能嵌套定义
  • 在java中,没有方法声明一说

方法的调用过程

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

  • 定义方法的时候,不会执行方法的代码,只有调用的时候才会执行
  • 一个方法可以被多次调用
    例子:计算 1! + 2! + 3! + 4! + 5!
//计算 1! + 2! + 3! + 4! + 5!public static int func(int n){int result = 1;for (int i = 1; i <= n; i++) {result *= i;}return result;}public static void main(String[] args) {int sum = 0;for (int i = 1; i <= 5; i++) {sum += func(i);}System.out.println(sum);}

实参和形参的关系

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

public static int add(int a, int b){    //a, b是形参return a + b;}
public static void main(String[] args){int ret = add(2,3); //2,3是实参,a,b分别用来保存2,3,在调用时传给形参a和bSystem.out.println(ret);}

注意:在java中,实参的值永远是拷贝到形参中,形参和实参本质是两个实体。
例子:交换两个整型变量

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

可以看到,在swap交换之后,形参a,b值发生了改变,但是main方法中a和b还是交换之前的值,即没有交换成功。
原因:因为实参a,b是main方法中的变量,其空间在main方法的栈中,而形参a和b是swap方法中的两个变量,a和b的空间在swap方法运行时的栈中,因此实参a和b与形参a和b是两个没有关联性的变量,在swap方法调用时,只是将实参a和b值拷贝一份传递给了形参a和b,因此对形参a和b操作不会对实参a和b产生任何影响
注意:对于基础类型,形参相当于实参的拷贝,即传值调用
解决方法:传引用类型参数(例如通过数组来解决)(java中,拿不到栈上变量的地址)

public static void swap(int[] arr){int tmp = arr[0];arr[0] = arr[1];arr[1] = tmp;}public static void main(String[] args) {int[] arr = {10,20};swap(arr);System.out.println("main:"+arr[0] + " " + arr[1]);}

方法重载

为什么需要方法重载

public static int add(int a, int b){return a + b;}public static void main(String[] args) {int x = 10;int y = 20;int ret1 = add(x,y);double a = 2.0;double b = 1.0;double ret2 = add(a,b);//编译报错:不兼容的类型: 从double转换到int可能会有损失}

任何解决呢
我们可能会采取再写另外一个方法

public static int add(int a, int b){return a + b;}public static double addDouble(double a, double b){return a + b;}public static void main(String[] args) {int x = 10;int y = 20;int ret1 = add(x,y);double a = 2.0;double b = 1.0;double ret2 = addDouble(a,b);//编译报错:不兼容的类型: 从double转换到int可能会有损失}

但是随着需求和要求增加,每增加新类型参数就需要新写一个方法,重新起一个方法名,想许多不同的方法名是一件比较烦人的事,能否都是同一个方法名呢?

方法重载的概念

在java中,方法是可以重载的,在java中,如果多个方法的名字相同,参数列表不同,则说该几种方法被重载了。
例子:

public static int add(int a, int b){return a + b;}public static double add(double a, double b){return a + b;}public static double add(double a, double b, double c){return a + b + c;}public static void main(String[] args) {int x = 10;int y = 20;int ret1 = add(x,y);//调用add(int,int)double a = 2.0;double b = 1.0;double c = 3.0;double ret2 = add(a,b);//调用add(double,double)double ret3 = add(a,b,c);//调用add(double,double,double)}

注意:

  1. 方法名必须相同
  2. 参数列表必须不同(参数的个数、参数的类型、类型的次序)
  3. 与返回值类型是否相同无关
  4. 如果两个数仅仅只是因为返回值类型不同,是不能构成重载的,会编译出错
  5. 编译器在编译代码时,会对实参类型进行推演,根据推演的结果来确定调用哪个方法

方法签名

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

public static int add(int a, int b){return a + b;}public static double add(double a, double b){return a + b;}public static double add(double a, double b, double c){return a + b + c;}public static void main(String[] args) {int x = 10;int y = 20;int ret1 = add(x,y);//调用add(int,int)double a = 2.0;double b = 1.0;double c = 3.0;double ret2 = add(a,b);//调用add(double,double)double ret3 = add(a,b,c);//调用add(double,double,double)}

上述代码经过编译之后,然后使用JDK自带的javap反汇编工具查看,具体操作:

  1. 先对工程进行编译生成.class字节码文件
  2. 在控制台中进入到要查看的.class所在的目录
  3. 输入:javap -v 字节码文件名字即可
    在这里插入图片描述
特殊字符数据类型
Vvoid
Zboolean
Bbyte
Cchar
Sshort
Iint
Jlong
Ffloat
Ddouble
[数组(以[开头,配合其他的特殊字符,表述对应数据类型的数组,几个[表述几维数组)
L引用类型,以L开头,以;结尾,中间是引用类型的全类名

递归

递归的概念

一个方法在执行过程中调用自身,即”递归“
解决递归问题:

  1. 有一个递归公式
  2. 找到当前递归问题的解决条件
    例子:用递归求N的阶乘
public static int func(int n){if (n == 1){return 1;}return n * func(n - 1);}public static void main(String[] args) {int n = 5;int ret = func(5);System.out.println(ret);//结果是120}

递归过程分析

理解清楚递归,首先必须理解清楚“方法的执行过程”,尤其是“方法执行结束之后,回到调用位置继续往下执行”
在这里插入图片描述

关于调用栈
方法调用的时候,会有一个“栈”这样的内存空间描述当前的调用关系,称为调用栈。
每一次的方法调用就称为一个“栈帧”,每个栈帧中包含了这次调用的参数是哪些,返回到哪里继续执行等信息。

递归练习

例子1:按顺序打印数字的每一位(例如1234,打印1 2 3 4)

//按顺序打印数字的每一位(例如1234,打印1 2 3 4)public static void print(int n){if (n > 9){print(n / 10);}System.out.print(n % 10 + " ");}public static void main(String[] args) {int num = 1234;print(num);}

例子2:递归求1 + 2 + 3 + … + 9 + 10

//递归求1 + 2 + 3 + ... + 9 + 10public static int sum(int n){if (n == 1){return 1;}return n + sum(n -1);}public static void main(String[] args) {int num = 10;int ret = sum(num);System.out.println(ret);//计算结果是55}

例子3:写一个递归方法,输入一个非负整数,返回组成它的数字之和. 例如,输入 1729, 则应该返回1+7+2+9,它的和是19

//写一个递归方法,输入一个非负整数,返回组成它的数字之和. 例如,输入 1729, 则应该返回1+7+2+9,它的和是19public static int sum(int n){if (n < 10) {return n;}return n % 10 + sum(n / 10);}public static void main(String[] args) {int num = 1729;int ret = sum(num);System.out.println(ret);}

例子4:求斐波那契数列的第N项

//求斐波那契数列的第N项public  static int fib(int n){if (n == 1 || n == 2){return 1;}return fib(n - 2) + fib(n-1);}public static void main(String[] args) {System.out.println(fib(5));}

当我们求fib(40)的时候发现程序运行速度很慢,原因是进行了大量的重复运算

public  static int fib(int n){if (n == 1 || n == 2){return 1;}if (n == 3){count++;}return fib(n - 2) + fib(n-1);}public static void main(String[] args) {System.out.println(fib(40));System.out.println(count );}//计算结果:102334155//			39088169(fib(3)计算的次数)

我们可以使用循环求斐波那契数列,避免冗余的计算。

public static int fib(int n){int num1 = 1;int num2 = 1;for (int i = 2; i < n; i++) {int tmp = num1 + num2;num1 = num2;num2 = tmp;}return num2;}public static void main(String[] args) {System.out.println(fib(40));}

———————————————————————————————————————————
对于方法的学习我们先了解到这里,后续我们继续学习和了解java的内容。

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

诸葛亮的连环计 责任链模式

“万事谋定而后动&#xff0c;一环扣一环&#xff0c;方能成大事。” 在三国时期&#xff0c;诸葛亮以其超凡的智慧闻名天下。在他众多的计策中&#xff0c;有一个鲜为人知却极具智慧的连环计&#xff0c;完美诠释了现代软件设计中的责任链模式。让我们一同探索这个巧妙的计策…

zookeeper加入开机启动项

Windows的任务计划程序&#xff08;Task Scheduler&#xff09;是一个强大的工具&#xff0c;允许你安排程序在特定时间自动运行&#xff0c;包括开机时。 打开任务计划程序&#xff1a; 按下Win R键&#xff0c;打开“运行”对话框。输入taskschd.msc并回车&#xff0c;打开…

数据结构--单向链表篇(python实现)

写在开头 链表&#xff08;Linked list&#xff09;是一种常见的基础数据结构&#xff0c;是一种线性表&#xff0c;但是并不会按线性的顺序存储数据&#xff0c;而是在每一个节点里存到下一个节点的指针(Pointer) 链表的优缺点 优点 不需要预先知道数据大小&#xff0c;实现灵…

前端面试题37(js递归)

在JavaScript中&#xff0c;递归是一种编程技术&#xff0c;它允许函数调用自身来解决问题。这种方法通常用于处理分治策略的算法&#xff0c;比如遍历树形结构、计算阶乘、 Fibonacci数列等。下面通过几个示例来说明如何使用递归。 1. 计算阶乘 阶乘是一个经典的递归示例&am…

硬盘分区读不出来的应对策略与数据恢复实战

在日常的计算机使用过程中&#xff0c;硬盘分区读不出来的问题时常困扰着用户。这一故障不仅可能导致重要数据的突然失联&#xff0c;还可能对系统的稳定运行造成威胁。硬盘分区读不出来&#xff0c;往往表现为在文件资源管理器中无法访问特定分区&#xff0c;系统提示错误或分…

信创:鲲鹏(arm64)+麒麟(kylin v10)离线部署k8s和kubesphere(含离线部署新方式)

本文将详细介绍&#xff0c;如何基于鲲鹏CPU(arm64)和操作系统 Kylin V10 SP2/SP3&#xff0c;利用 KubeKey 制作 KubeSphere 和 Kubernetes 离线安装包&#xff0c;并实战部署 KubeSphere 3.3.1 和 Kubernetes 1.22.12 集群。 服务器配置 主机名IPCPUOS用途master-1192.168.10…

jitsi 使用JWT验证用户身份

前言 Jitsi Meet是一个很棒的会议系统,但是默认他运行所有人创建会议,这样在某种程度上,我们会觉得他不安全,下面我们就来介绍下使用JWT来验证用户身份 方案 卸载旧的lua依赖性sudo apt-get purge lua5.1 liblua5.1-0 liblua5.1-dev luarocks添加ubuntu的依赖源,有则不需…

D2D用户的功率优化算法研究

D2D通信技术是指两个对等的用户节点之间直接进行通信的一种通信方式。在由D2D通信用户组成的分布式网络中&#xff0c;每个用户节点都能发送和接收信号&#xff0c;并具有自动路由(转发消息)的功能。网络的参与者共享它们所拥有的一部分硬件资源&#xff0c;包括信息处理、存储…

HTML5表单的自动验证、取消验证、自定义错误信息

1、自动验证 通过在元素中使用属性的方法&#xff0c;该属性可以实现在表单提交时执行自动验证的功能。下面是关于对元素内输入内容进行限制的属性的指定。 属性说明required输入内容是否不为空pattern输入的内容是否符合指定格式min、max输入的数值是否在min~max范围step判断…

使用Maven命令将第三方jar包安装到maven本地仓库

使用Maven命令将第三方jar包安装到maven本地仓库 事例&#xff1a; 第三方jar包 &#xff1a;common-pojo-1.0-SNAPSHOT.jar Maven命令 mvn install:install-file -Dfilejar包在本地磁盘的路径 -DgroupId组织名称 -DartifactId项目名称 -Dversion版本号 -Dpackaging打包方式 完…

【初阶数据结构】1.算法复杂度

文章目录 1.数据结构前言1.1 数据结构1.2 算法1.3 如何学好数据结构和算法 2.算法效率2.1 复杂度的概念2.2 复杂度的重要性 3.时间复杂度3.1 大O的渐进表示法3.2 时间复杂度计算示例3.2.1 示例13.2.2 示例23.2.3 示例33.2.4 示例43.2.5 示例53.2.6 示例63.2.7 示例7 4.空间复杂…

乐器培训课程报名小程序模板源码

模板介绍 一款实用的音乐课程&#xff0c;乐器培训&#xff0c;艺术类网页课程报名手机小程序模板下载。包含&#xff1a;主页、列表、个人中心、报名等模块。 图片演示 乐器培训课程报名小程序模板源码

6.MkDocs附录

安装插件 在 MkDocs 中&#xff0c;插件通常是通过 pip​ 工具安装的。你可以使用以下步骤来安装和配置 MkDocs 插件。 1.使用 pip​ 命令安装你需要的插件。例如 pip install pymdown-extensions‍ 2.更新 mkdocs.yml​ 文件。 ‍ 3.使用 mkdocs serve​ 命令本地预览你…

PHP禁止IP访问和IP段访问(代码实例)

PHP禁止IP和IP段访问 实现IP限制是Web开发中常见的需求之一&#xff0c;它可以用于限制特定IP地址的访问权限。在PHP中&#xff0c;我们可以通过一些方法来实现IP限制。 <?//禁止某个IP$banned_ip array ("127.0.0.1",//"119.6.20.66","192.168.…

旷野之间2 - 如何训练医疗保健小型语言模型(AI-SLM)

​​​​ 在本文中,我们将研究如何针对疾病症状训练一个小型医疗保健语言模型。为此,我们将从HuggingFace获取数据集(用于训练我们的模型):https://huggingface.co/datasets/QuyenAnhDE/Diseases_Symptoms QuyenAnhDE/Diseases_Symptoms 数据集来自 Hugging Face。图片来源…

cesium 雷达扫描

cesium 雷达扫描 (下面附有源码) 实现思路 1、通过改变圆型材质来实现效果, 2、用了模运算和步进函数(step)来创建一个重复的圆形图案 3、当纹理坐标st落在垂直或水平的中心线上时,该代码将改变透明度和颜色,以突出显示这些线 示例代码 <!DOCTYPE html> <ht…

MacOS如何切换shell类型

切换 shell 类型 如果你想在不同的 shell 之间切换&#xff0c;以探索它们的不同之处&#xff0c;或者因为你知道自己需要其中的一个或另一个&#xff0c;可以使用如下命令&#xff1a; 切换到 bash chsh -s $(which bash)切换到 zsh chsh -s $(which zsh)$()语法的作用是运…

04 效用评测层 显性指标+标准方法 对推荐效果定量评测

你好&#xff0c;我是大师兄。前面三节课我们介绍了推荐系统的数据采集层和数据加工层的相关内容&#xff0c;本节课我们重点介绍下推荐系统效用评价层的评测方法和评测指标。 这里的“效用评测”&#xff0c;通俗点说是指推荐系统输出数据的好坏是否符合用户和商业的预期&…

【python】PyQt5事件传递,鼠标动作捕获,键盘按键捕获原理与应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

MiniGPT-Med 通用医学视觉大模型:生成医学报告 + 视觉问答 + 医学疾病识别

MiniGPT-Med 通用医学视觉大模型&#xff1a;生成医学报告 视觉问答 医学疾病识别 提出背景解法拆解 论文&#xff1a;https://arxiv.org/pdf/2407.04106 代码&#xff1a;https://github.com/Vision-CAIR/MiniGPT-Med 提出背景 近年来&#xff0c;人工智能&#xff08;AI…