黑马程序员-JavaSE核心知识-10方法
3.10、方法(重点)
如果说之前的所有语法和各个语言类似,那么现在的方法就稍微特殊一些了。
3.10.1 、方法的基本定义
方法在很多地方又被称为函数(Java之中的英文单词是Method,而其他语言之中的英文单词是Function),方法是一段可以被重复调用代码块。但是需要说明的是,今天所讲解的方法,本身是在主类之中定义的,并且由主方法调用的。所以方法的定义格式为:
public static 返回值类型 方法名称 (参数列表) { [return [返回值] ;] } |
对于返回值类型有两种:
· void:表示此方法没有返回值;
· 数据类型:基本类型和引用类型。
范例:定义一个无参的无返回值的方法
public class Hello { public static void main(String args[]) { printInfo() ; // 主方法之中直接调用 printInfo() ; // 主方法之中直接调用 printInfo() ; // 主方法之中直接调用 } public static void printInfo() { // 方法名称 System.out.println("*******************") ; System.out.println("* Hello World *") ; System.out.println("*******************") ; } } |
方法名称的命名要求|:第一个单词的首字母小写,之后每个单词的首字母大写,例如:printInfo()。
范例:定义一个有参的,无返回值方法,例如:将之前打印三角形程序定义唯一个方法,每次只需要传入打印的行即可。
public class Hello { public static void main(String args[]) { printInfo(3) ; // 主方法之中直接调用 printInfo(5) ; // 主方法之中直接调用 printInfo(9) ; // 主方法之中直接调用 } public static void printInfo(int line) { // 方法名称 for (int x = 0 ; x < line ; x ++) { // 循环次数,控制行 for (int y = 0 ; y < line - x ; y ++) { System.out.print(" ") ; } for (int y = 0 ; y <= x ; y ++) { System.out.print("* ") ; } System.out.println() ; } } } |
方法负责完成某一特定功能,而后用户就可以根据方法定义的格式进行方法的调用。
范例:定义一个有参有返回值的方法
· 定义一个方法,用于判断一个数字是奇数还是偶数。很明显,这个方法的返回值类型应该定义为boolean比较合适,而且如果一个方法上返回的是boolean型数据,则这个方法的名称应该以isXxx()的形式命名。
public class Hello { public static void main(String args[]) { if (isType(3)) { System.out.println("偶数") ; } else { System.out.println("奇数") ; } } // true表示是偶数,false表示为奇数 public static boolean isType(int num) { return num % 2 == 0; } } |
讲解到方法的时候需要额外强调一点,如果一个方法使用了void声明,理论上此方法不能够返回数据,但是这个方法却可以通过return结束调用(即:return之后的程序不再执行)。
public class Hello { public static void main(String args[]) { fun(10) ; fun(30) ; } public static void fun(int num) { if (num == 10) { return ; // 结束方法调用 } System.out.println("数值:" + num) ; } } |
而这一结束的操作和循环控制的break与continue是一样的。
· break:表示的是退出整个循环;
· continue:表示的是退出一次循环;
break控制: |
continue控制: |
public class Hello { public static void main(String args[]) { for (int x = 0 ; x < 10 ; x ++) { if (x == 3) { break ; } System.out.println(x) ; } } } |
public class Hello { public static void main(String args[]) { for (int x = 0 ; x < 10 ; x ++) { if (x == 3) { continue ; } System.out.println(x) ; } } } |
这三种操作都离不开if语句判断,只要是结束的操作都肯定需要使用if判断。
3.10.2 、方法的重载(重点)
在讲解重载操作之前,首先完成这样的一种定义,要求定义方法,此方法可以完成两个整数的相加,或者是两个小数的相加,或者是三个整数的相加,那么如果按照习惯性的思路,现在一定要定义三个方法,可能方法就编写如下了:
public class Hello { public static void main(String args[]) { System.out.println("两个整型相加:" + add1(10,20)) ; System.out.println("三个整型相加:" + add2(10,20,30)) ; System.out.println("两个浮点型相加:" + add3(10.2,20.3)) ; } public static int add1(int x,int y) { return x + y ; } public static int add2(int x,int y,int z) { return x + y + z ; } public static double add3(double x,double y) { return x + y ; } } |
现在已经成功的完成了代码的调用,但是如果按照这种思路,现在有1000种这样的增加方法,这个时候调用起来就很麻烦,还要首先区分出方法的编号是多少,这种不合适的操作一定不是我们所使用的。
在这种情况下可以使用方法的重载(Overloading)来解决问题,方法重载指的是方法名称相同,参数的类型或个数不同,调用的时候将会按照传递的参数类型和个数完成不同的方法体的执行。
public class Hello { 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)) ; } public static int add(int x,int y) { return x + y ; } public static int add(int x,int y,int z) { return x + y + z ; } public static double add(double x,double y) { return x + y ; } } |
它是自动的根据参数的类型和个数的不同调用不同的方法体进行执行。
但是讨论一下,以下的代码属于方法重载吗?
public class Hello { public static void main(String args[]) { System.out.println("两个整型相加:" + add(10,20)) ; System.out.println("两个浮点型相加:" + add(10,20)) ; } public static int add(int x,int y) { return x + y ; } public static double add(int x,int y) { // 返回值不同 return x + y ; } } |
可以发现,这个时候除了方法的返回值类型不一样之外,方法的参数类型及个数完全相同,所以这种操作不符合于方法重载的定义。
额外提醒:
方法重载的时候并没有规定出返回值类型必须统一,即:重载的方法返回值类型可以不一样,但是从开发的角度而言,建议所有方法重载之后返回值类型统一,但是这种规则不是死的,至少在我们自己编写的代码之中,80%的情况下可以满足。
范例:继续观察如下代码
public class Hello { public static void main(String args[]) { System.out.println("Hello World") ; // 输出String System.out.println(100) ; // 输出int System.out.println(3000.9) ; // 输出double System.out.println('A') ; // 输出char System.out.println(true) ; // 输出boolean } } |
所以,可以得出一个结论:System.out.println()实际上就是进行了方法的重载。
3.10.3 、递归调用(了解)
递归操作指的是方法自己调用自己的形式,但是在进行递归操作的时候必须满足如下的几个条件:
· 必须有结束条件;
· 每次调用的时候都需要改变传递的参数。
范例:完成一个1 ~ 100的累加
public class Hello { public static void main(String args[]) { int sum = 0 ; int x = 1 ; while( x <= 100 ) { sum += x ; x ++ ; } System.out.println(sum) ; } } |
几乎所有的while循环都可以改变为递归操作。
范例:递归操作
public class Hello { public static void main(String args[]) { System.out.println(add(100)) ; } public static int add(int num) { if (num == 1) { // 结束条件 return 1 ; // 不再向后继续加了 } return num + add(num - 1) ; // 修改参数内容 } // 第1次调用:return 100 + add(99); // 第2次调用:return 100 + 99 + add(98); // 倒数第2次调用:return 100 + 99 + ... + 3 + add(2) ; // 最后一次调用:return 100 + 99 + ... + 3 + 2 + 1 ; } |
对于递归操作,现在只要求可以理解这个含义即可,而在实际的工作之中,递归尽量少去使用,因为使用不当,就可能造成内存溢出。
4、总结
1、 JDK的安装和配置;
2、 classpath和path的区别;
3、 数据类型的划分及默认值;
4、 程序的三种结构;
5、 switch在JDK 1.7之后可以对字符串数据进行判断了;
6、 方法以及方法重载的操作。
5、预习任务
面向对象的概念、类与对象、构造方法、private封装、匿名对象、数组、对象数组。
6、作业
1、 要求计算出:1! + 2! + … + 60!的结果。
2、 编写一个方法,此方法可以将一个整数变为二进制输出(提示:二进制的计算方法:数字除2取余,倒着取余数。)。
3、 有5个人坐在一起,问第5个人多少岁?答:比第4个人大2岁,问第四个人多少岁的时候,比第三个人大2岁,问第三个人多少岁的时候,比第二个人大2岁,问第一个人的时候,第一个人说自己是8岁。