【Java基础教程】(六)程序概念篇 · 末:全面讲解Java方法的定义及应用、方法重载及递归~

news2024/11/15 20:05:08

Java基础教程之程序概念 · 末

  • 本节学习目标
  • 1️⃣ 方法的定义与使用
    • 1.1 概念
      • 🔍 在编写代码时,怎么判断什么情况下应该定义方法?
    • 1.2 方法重载
    • 1.3 方法递归
  • 🌾 总结

在这里插入图片描述

本节学习目标

  • 掌握Java中方法的定义结构、方法重载的概念与应用;

1️⃣ 方法的定义与使用

方法在很多其他编程开发语言中又被称为函数(在 Java 中的英文单词是 Method, 而在其他语言中的英文单词是 Function), 方法是一段可以被重复调用的代码块。

1.1 概念

方法的主要功能是封装可以执行的一段代码,这样不仅可以进行重复调用,更可以方便地实现代码的维护,而方法的定义语法如下。

public static 返回值类型 方法名称(参数类型 参数变量, ...){
	方法体(本方法要执行的若干操作);
	[return [返回值];]
}

在方法的定义格式中,有一个返回值类型,指的是这个方法的返回结果。对于此返回值类型可以有以下两种:

  • 设置为Java中的数据类型(基本数据类型、引用数据类型都可),如果方法设置了返回值,那么必须使用 return 语句返回与数据类型对应的数据;
  • 没有返回值: void,这种情况可以不使用return返回内容,但是可以使用 return 结束方法调用。
//	案例 1: 定义一个没有参数没有返回值的方法
public class TestDemo{
	public static void main(String args[]){
		printInfo();                                    //直接调用方法
	}

	/**
	* 信息输出操作
	*/
	public static void printInfo(){		//定义没有参数,没有返回值的方法
		System.out.println("***************************************************");
		System.out.println("** https://lst66.blog.csdn.net/?type=blog **");
		System.out.println("***************************************************");
	}
}

程序执行结果:

***************************************************
** https://lst66.blog.csdn.net/?type=blog **
***************************************************

此程序首先在主类中定义了一个 printInfo()方法,此方法主要是进行字符串内容的输出,所以在方法声明返回值时使用了 void, 然后在主方法之中调用了方法。程序的执行流程如下图所示:

在这里插入图片描述
一个需要注意的地方是方法的命名规范。如果要在程序中定义方法,Java的命名规范为:第一个单词的首字母小写,之后每个单词的首字母大写,例如:printInfo()getMessage()setName()

//	案例 2: 定义一个有参数无返回值的方法
public class TestDemo{
	public static void main(String args[]){
		pay(10.0);
		pay(-10.0);
	}
	/**
	*定义一个支付的操作方法,如果支付金额大于0 则正常支付,否则会输出错误提示信息 
	*@param  money 要支付的金额
	*/
	public static void pay(double money)(   //购买支付操作
		if(money>0.0){                    //现在已经给钱
			System.out.println("可以进行支付!");
		}else{                             //不能够支付
			System.out.println("没钱还买东西!");
		}
	}
}

程序执行结果:

可以进行支付! 
没钱还买东西!

此程序定义了一个pay() 方法,而后在此方法中定义了一个参数,并在方法中针对传入的内容进行判断后输出。

//	案例 3: 定义有参数有返回值的方法
public class TestDemo {
	public static void main(String args[]){
		int result = add(10, 20);                 //方法的返回值可以进行接收
		System.out.println("计算结果:"+ result);
		System.out.printin("计算结果:"+ add(50,60));	//也可以直接将方法返回值进行输出
	}
	
	/**
	*实现数据的加法操作
	*@param  x 操作数字一
	*@param  y 操作数字二
	*@return 返回两个数字的加法计算结果
	*/
	public static int add(int x, int y){      //有参数有返回值的方法
		return x+y;                         //返回加法计算结果
	}
}

程序执行结果:

计算结果:30
计算结果:110

此程序在类中定义了一个 add() 方法,而后此方法接收两个 int 型的变量,执行加法计算后会将计算的结果返回给方法的调用处,由于方法本身存在返回值,所以可以接收返回值,或者直接进行返回值 的输出。

以上就是方法在实际开发中的3种基本定义形式,但有一点需要注意的是,如果在方法中执行 return 语句,那么就表示其之后的代码不再执行而直接结束方法调用。如果此时方法有返回值声明,那么必须返回相应类型的数据;如果没有返回值声明,则可以直接编写 return;。 此类操作一般都会结合分支判断一起使用。

//	案例 4: 利用 return  结束方法调用
public class TestDemo{
	public static void main(String args[]){ 
		set(100);	//正常执行输出
		set(3);		//满足方法判断条件,会中断输出操作
		set(10);	//正常执行输出
	}

	/**
	*定义一个设置数据的操作方法,如果该数据为3将无法设置
	*@param  x 要设置的数据内容
	*/
	public static void set(int x){	//方法声明为void
		if(x==3){				//判断语句
			return;				//方法后面的内容不执行了
		}
		System.out.println("x=" + x);
	}
}

程序执行结果:

x=100
x=10

此程序定义的 set()方法上使用了 void 声明,所以在此类方法中如果想要结束调用,可以直接编写 return语句,当传入的参数内容为3时,符合方法结束调用的条件,所以后面的输出将不再执行。

🔍 在编写代码时,怎么判断什么情况下应该定义方法?

在Java中,定义方法的时机取决于程序的组织和逻辑结构。以下是一些常见的情况,可以考虑定义一个方法:

  • 代码重复:当代码块需要在多个地方使用时,可以将其封装在一个方法中。这样提高了代码的可读性、可维护性,并减少代码的重复;
  • 功能模块化:当某个功能需要进行模块化的处理或操作时,可以将其实现封装在一个方法中。这样方便其他部分的调用;
  • 复杂逻辑:当代码包含一系列复杂的判断、计算或操作过程时,可以将其抽象为一个方法。这样可以简化主要逻辑的代码结构,使其更易于理解和维护;
  • 面向对象设计:根据面向对象的原则,每个对象都应该具备相应的行为(方法)。因此,在设计类的过程中,需要根据对象的职责和行为来定义相应的方法。


所以,当代码存在重复、需要模块化、包含复杂逻辑或符合面向对象设计原则时,都可以考虑定义一个方法。这样可以提高代码的可读性、可维护性和可复用性。

1.2 方法重载

方法的重载是指 方法名称相同,参数的类型或个数不同,调用的时候将会按照 传递的参数类型和个数完成不同方法体的执行。

如果有一个方法名称,有可能要执行多项操作,例如: 一个 add() 方法,它可能执行两个整数的相加,也可能执行三个整数的相加,或者可能执行两个小数的相加,那么在这样的情况下,很明显一个方法体肯定无法满足要求,需要为 add() 方法定义多个不同的功能实现,所以此时就需要方法重载概念的支持。

//	案例 5: 方法重载
public class TestDemo{
	public static void main(String args[]){
		//方法重载之后执行语句时会根据传入参数的类型或个数的不同调用不同的方法体
		System.out.println("两个整型参数:"+ add(10,20));
		System.out.println("三个整型参数:"+ add(10,20,30);
		System.out.println("两个浮点型参数:"+ add(10.2,20.3);
	}
	
	/**
	*实现两个整型数字的加法计算操作
	*@param x 操作数字一
	*@param y 操作数字二
	*@return 两个整型数据的加法计算结果
	*/
	public static int add(int x, int y){
		return x+y;
	}

	/**
	*实现三个整型数字的加法计算操作
	*@param  x 操作数字一
	*@param y 操作数字二
	*@paramz  操作数字三
	*@return 三个整型数据的加法计算结果
	*/
	public static int add(int x, int y, int z){	//与之前的add()方法的参数个数不一样
		return x+y+z;
	}
		
	/**
	*实现两个小数的加法计算操作 
	*@param x 操作数字一
	*@param y 操作数字二
	*@return 两个小数的加法计算结果
	*/
	public static double add(double x,double y){  // 与之前的add()方法的参数类型不一样
		return x+y;
	}
}

程序执行结果:

两个整型参数:30
三个整型参数:60
两个浮点型参数:30.5

此程序在类中一共定义了3个 add() 方法,但是这3个 add() 方法的参数个数以及数量不同, 也即此时 add() 方法是方法被重载的情况。而在调用方法时,虽然方法的调用名称相同,但是会根据其声明的参数个数或类型执行不同的方法体,调用过程如下图所示。

在这里插入图片描述

方法重载的概念本身很容易理解,但是对于方法重载有以下两点说明。

  • 在进行方法重载时一定要考虑到参数类型的统一,虽然可以实现重载方法返回不同类型的操作, 但是从标准的开发来讲,建议所有重载后的方法使用同一种返回值类型;
  • 方法重载的时候重点是根据参数类型及个数来区分不同的方法,而不是依靠返回值的不同来确定的。

1.3 方法递归

递归调用是一种特殊的调用形式,指的是方法自己调用自己的形式。 递归调用也是程序员们踏入数据结构开发的第一步,但要想熟能生巧并写出高质量的递归代码,需要经历大量实践和积累。换句话说,在标准项目应用开发中,使用递归操作是相对较少的。

在实际开发中避免过多使用递归的主要原因是潜在的内存溢出问题。如果递归处理不当,会导致无限循环或者占用过多的系统资源,从而引发内存溢出错误。

然而,不可否认的是,递归在某些情况下是非常有用的。特别是对于解决具有递归性质的问题,如树、图等数据结构相关的操作,递归算法可以更直观和简洁地解决问题。不过,为了保证代码的健壮性和性能,我们需要注意以下几点:

  1. 给递归函数设置终止(结束)条件,确保递归能够在适当的时候结束,避免无限循环;
  2. 明确递归调用的目的和流程,避免逻辑错误和不必要的递归调用;
  3. 评估递归的深度和规模,确保递归的资源占用在可接受范围内;
  4. 避免重复计算,利用缓存机制或优化算法,提高递归函数的效率。

上面四点中,初学者主要需注意第一点和第二点,而对于有经验的朋友来说在使用递归时应同时注意第三点和第四点。而虽然递归是编程中一种强大的思维工具,但在实际开发中使用时需要谨慎,并结合实际情况进行判断。掌握适当的使用方法和避免常见错误,可以使我们更好地利用递归算法来解决问题。

在这里插入图片描述

//	案例 6: 递归调用
public class TestDemo{
	public static void main(String args[]){
		System.out.println(sum(100));
	}

	/**
	*数据的累加操作,传入一个数据累加操作的最大值,而后每次进行数据的递减,一直累加到计算数据为1 
	*@param num 要进行累加的操作
	*@return 数据的累加结果
	*/
	public static int sum(int num){
		if (num ==1){	//递归的结束调用
			return 1;	//最终的结果返回了1
		}
		return num + sum(num-1);
	}
}

程序执行结果:

5050

此程序使用递归操作进行了数字的累加操作,并且当传递的参数为1 时,直接返回为数字1。本程序的执行流程如下:

  • 第1次调用:return 100+ sum(99);
  • 第2次调用:return 100+99+sum(98);
  • 倒数第2次调用:return 100+99+…+3+sum(2);
  • 最后一次调用:return 100+99+…+3+2+1。

🌾 总结

Java方法的定义与使用、概念、方法重载和方法递归是我们在编写Java程序时常用的工具和技术。经过这篇文章的探索,我们对这些概念有了更深入的理解。

方法的定义与使用是构建可复用代码块的关键。通过合理地划分功能模块,在代码中加入方法可以提高代码的可读性、可维护性和可复用性。同时,方法的参数和返回值类型可以帮助我们实现更灵活的程序逻辑。

方法重载允许我们在同一个类中定义多个同名方法,只要它们在参数列表上有所区别。这样可以根据不同的需求调用不同的方法,避免冗余代码,提高代码的灵活性。

方法递归是一种强大的工具,通过调用自身来解决复杂问题。但是在使用递归时,需谨慎考虑终止条件、递归深度和效率等方面。合理使用递归可以简化问题的解决方式,但也需要注意内存溢出等潜在风险。

Java方法是我们编程旅程中的得力助手,拥有它们的理解将使我们能够更加灵活地处理问题,写出高效、健壮的代码。掌握方法的定义与使用、概念、方法重载和方法递归,将让我们在Java开发中驾驭无限的可能性。


温习回顾上一篇(点击跳转)《【Java基础教程】(五)程序概念篇 · 下》
继续阅读下一篇(点击跳转)《【Java基础教程】(七)面向对象篇 · 上》


本文部分案例及图片来源:
《第一行代码JAVA》

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

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

相关文章

EulerOS2.0SP10操作系统Esxi虚拟机安装手记

本文记录了在 Esxi7.0平台上新建虚拟机安装华为EulerOS2.0SP10国产操作系统的过程,仅供参考。 一、新建虚拟机 1、在VCenter上选中集群,右键选择新建虚拟机 2、在新建虚拟机视图点NEXT 3、输入虚拟机名称(自定义),选…

Apikit 自学日记:如何引用全局变量

引用全局变量 一、什么是全局变量 全局变量可以在测试过程中动态取值以及赋值,比如:使用登录接口获取 token,将 token 值赋值给自定义全局变量 global_token,然后在另一个需要使用该token的接口中,使用 {{global_toke…

css,less,scss中的深度选择器,结合elementUi使用

css中深度选择器用到的是 >>>加类名 可以很方便的找到自己想要修改的样式 lees中用到 /deep/ 加类名 scss中用到::v-deep 加类名

【软件工具使用体验NFC】读取nfc里的内容和写入nfc的内容 tagInfo和TagWritter两款软件的使用和下载

教程目录 教程简介所需环境和版本资源免费下载执行过程tagInfo的使用:tagWritter的使用:my dataset的解释: 结束语 教程简介 这篇内容主要是前段时间开发了一个小程序的时候涉及到了通过小程序读写nfc标签的内容,当时还特地和我们…

特征模型仿真例1:参数辨识

题目 考虑被控对象 G ( s ) 3 s 4 s 4 5 s 3 10 s 2 6 s 4 G(s)\frac{3 s4}{s^{4}5 s^{3}10 s^{2}6 s4} G(s)s45s310s26s43s4​ 和特征模型 y ( k ) ϕ T ( k − 1 ) θ ( k ) y(k)\boldsymbol{\phi}^{\mathrm{T}}(k-1)\boldsymbol{\theta}(k) y(k)ϕT(k−1)θ(k) 其…

谁告诉我这是什么文件,怎么了?活不起了?得靠这个冲业绩?

TIM 从一年前就卸载了,今天整理磁盘才发现还有这么多文件,想着没什么用直接删掉得了,没想到他娘的死活删不掉,好多文件一个一个删才找到这玩意,所有能查找运行程序的地方都找遍了,死活没找到在哪打开了&…

第一章 系统服务监控-SpringBootAdmin

前言 本来想用一节就写完SpringBootAdmin的,但随着研究的深入发现一节应该是不够的,网上的资料也不会非常系统,官网的例子有些已经好几年没更新了,所以接下来还是系统性的来写下吧 第一节 完成基础配置,暴露所有端点…

​如何从任何地方访问办公室电脑?

​远程办公已然成为了一种常见的办公方式,在远程工作期间访问办公室电脑获取必要的文件或信息非常重要。与远程访问同一网络中的电脑不同,使用Windows远程桌面从外部访问办公室电脑需要进行端口转发。对于很多人来说,端口转发可能有点复杂。那…

SpringBoot整合RestTemplate用法讲解(完整详细)

前言:本篇主要介绍了RestTemplate中的GET,POST,PUT,DELETE、文件上传和文件下载6大常用的功能,每一个方法和每一行代码都进行了详细的讲解,代码都是亲自测试过的,整篇博客写完以后自己也是受益匪…

缓存穿透、缓存击穿、缓存雪崩详解以及解决方案

缓存穿透、缓存击穿、缓存雪崩详解以及解决方案 一。缓存穿透 查询一个不存在的数据,mysql查询不到数据也不会直接写入缓存,就会导致每次请求都查数据库 方案一: 方案二: 二。缓存击穿 给某一个key设置了过期时间&#xff0…

Mongdb之Robo3T

🏆今日学习目标: 🍀MyBatis详解 ✅创作者:林在闪闪发光 ⏰预计时间:30分钟 🎉个人主页:林在闪闪发光的个人主页 🍁林在闪闪发光的个人社区,欢迎你的加入: 林在闪闪发光的…

2023年PTA行业研究报告

第一章 行业概况 精对苯二甲酸(Pure Terephthalic Acid,简称PTA)是一种主要用于制造聚酯纤维和塑料的关键化学品。PTA是一种白色结晶固体,可通过对苯二酮在催化剂的作用下进行氧化得到。它是聚对苯二甲酸乙二醇酯(PET…

机器视觉三维重建

推荐:将 NSDT场景编辑器 加入你的3D开发工具链。 1、Meshroom ⭐4,474 Meshroom是一款基于AliceVision摄影测量计算机视觉框架的免费开源三维重建软件。 https://github.com/alicevision/meshroom 2、Openmvg ⭐2,829 Openmvg库根据三维计算机视觉和结构的运动。…

Web3 通过truffle 脚本进行智能合约测试

上文 Web3 处理智能合约部署到本地区块链,并在本地进行测试中 我们讲解了部署智能合约 然后在终端测试的方法 但上文那种终端测试 其实并不保险 而且也比较不专业 对于这个 有一个mocha测试 这是基于node部署环境的一种环境测试 但是这个需要一定的基础 大家可以专门…

国产BI工具和国外BI工具,差距大不大,用哪种比较好?

自“十四五”以来,我国诸多政策开始推动信创产业的深入,实现关键数字技术自主研发和自主可控。我国信创产业竞争力不断突破,国产化进程稳步推进。2022年开始政策重点提及“数字经济”、“数字政府”和国家信息化。在此背景下,BI产…

el-date-picker 的初始化数据格式理解、报错 “TypeError: date.getFullYear is not a function“

个人理解 如果后端传给前端的时间数据是字符串类型的,那么当触发 el-date-picker 组件时,就会报出很多错误,例如 这是由于初始化赋值格式的问题,需要对初始化值,进行一个 new Date(your_time_data) 前端演示模板&…

虚拟机快速克隆的步骤

目录 1、关于让应用的快捷方式出现在开始栏的方法2、使用VMware快速克隆2-12-22-32-42-5 克隆虚拟机命名 1、关于让应用的快捷方式出现在开始栏的方法 把应用的快捷方式,放到这个目录中 C:\Users\用户名\AppData\Roaming\Microsoft\Windows\Start Menu\Programs2、…

uniapp app分享pdf等文件等到微信以及其他应用

uniapp自带的api uni.share只能分享图文等,但不能分享pdf这种之类的 想实现分享文件这种就要调用系统的分享功能 分享插件地址 这个插件完美解决,安卓分享到微信也不需要配置appid 封装用法 /*** 任意文件分享,需勾选云插件并云打包* 安卓调用系统分享无…

DFS解决N-皇后问题

题目: n−皇后问题是指将 n个皇后放在 nn的国际象棋棋盘上,使得皇后不能相互攻击到,即任意两个皇后都不能处于同一行、同一列或同一斜线上。 现在给定整数 n,请你输出所有的满足条件的棋子摆法。 输入格式 共一行,包…

《IntelliJ IDEA 2023最新版快捷键大全GIF动图演示》——提升你的开发效率

🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~&#x1f33…