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 方法递归
递归调用是一种特殊的调用形式,指的是方法自己调用自己的形式。 递归调用也是程序员们踏入数据结构开发的第一步,但要想熟能生巧并写出高质量的递归代码,需要经历大量实践和积累。换句话说,在标准项目应用开发中,使用递归操作是相对较少的。
在实际开发中避免过多使用递归的主要原因是潜在的内存溢出问题。如果递归处理不当,会导致无限循环或者占用过多的系统资源,从而引发内存溢出错误。
然而,不可否认的是,递归在某些情况下是非常有用的。特别是对于解决具有递归性质的问题,如树、图等数据结构相关的操作,递归算法可以更直观和简洁地解决问题。不过,为了保证代码的健壮性和性能,我们需要注意以下几点:
- 给递归函数设置终止(结束)条件,确保递归能够在适当的时候结束,避免无限循环;
- 明确递归调用的目的和流程,避免逻辑错误和不必要的递归调用;
- 评估递归的深度和规模,确保递归的资源占用在可接受范围内;
- 避免重复计算,利用缓存机制或优化算法,提高递归函数的效率。
上面四点中,初学者主要需注意第一点和第二点,而对于有经验的朋友来说在使用递归时应同时注意第三点和第四点。而虽然递归是编程中一种强大的思维工具,但在实际开发中使用时需要谨慎,并结合实际情况进行判断。掌握适当的使用方法和避免常见错误,可以使我们更好地利用递归算法来解决问题。
// 案例 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》