JavaSE 第三章 流程控制语句&方法定义 笔记

3.1 语句

程序的功能是由语句来完成的,语句分为单语句和复合语句。

单语句又分为:
(1)空语句,什么功能都没有。它就是单独的一个分号;( 需要避免 )
(2)表达式语句,就是表达式后面加分号;

  • new表达式;
  • 方法调用表达式;
  • 计算表达式中的赋值表达式、自增自减表达式

复合语句分为:
(1)分支语句:if...else,switch...case
(2)循环语句:for,while,do...while
(3)跳转语句:break,continue,return,throw
(4)try语句:try...catch...finally
(5)同步语句:synchronized

3.2 顺序结构

顺序结构就是程序从上到下逐行地执行。表达式语句都是顺序执行的。并且上一行对某个变量的修改对下一行会产生影响。

在这里插入图片描述
代码示例:

public class StatementTest {
    public static void main(String[] args) {
        int x = 2 ;
        int y = 4 ;
        x ++ ;
        y -- ;
        System.out.println("x=" + x);
        System.out.println("y=" + y);
    }
}

3.3 输入输出语句

3.3.1 常见的输出语句

  • 换行输出语句:输出内容后进行换行
System.out.println("输出内容") ;

在这里插入图片描述

  • 不换行输出语句:输出内容后后不换行
System.out.print(输出内容);

在这里插入图片描述

public class PrintlnAndPrintTest {
    public static void main(String[] args) {
        String str = "万般皆下品,唯有读书高。" ;
        int i = 21 ;
        System.out.println(str);
        System.out.println(i);
        System.out.println();
        System.out.print(str);
        System.out.print(i);
    }
}

在这里插入图片描述

换行输出语句,括号内可以什么都不写,只做换行处理
不换行输出语句,括号内什么都不写的话,编译报错

3.3.2 输入语句

  • 键盘输入代码的四个步骤:
  • 导包
    • 格式:import java.util.Scanner;
    • 位置:在class上面
  • 创建键盘录入对象
    • 格式:Scanner scan = new Scanner(System.in);
    • new 关键字,创建一个引用数据类型的对象
  • 通过对象获取数据
    • 格式:int x = scan.nextInt();
  • 释放资源
    • 格式:scan.close();

各种类型的数据输入
在这里插入图片描述
在这里插入图片描述

import java.util.Scanner ;  // 导包

public class ScannerTest {
    public static void main(String[] args) {
        // 创建输入对象
        Scanner scan = new Scanner(System.in) ;

        System.out.print("请输入一个byte类型的整数:");
        byte b = scan.nextByte() ;

        System.out.print("请输入一个short类型的整数:");
        short s = scan.nextShort() ;

        System.out.print("请输入一个int类型的整数:");
        int i = scan.nextInt() ;

        System.out.print("请输入一个long类型的整数:");
        long l = scan.nextLong() ;

        System.out.print("请输入一个float类型的浮点数:");
        float f = scan.nextFloat() ;

        System.out.print("请输入一个double类型的浮点数:");
        double d = scan.nextDouble() ;

        System.out.print("请输入一个boolean类型的值:");
        boolean b1 = scan.nextBoolean() ;

        System.out.print("请输入一个字符串:");
        String str1 = scan.next() ;
        System.out.print("请输入一个字符串:");
        String str2 = scan.nextLine() ;
		
        scan.close();
    }
}

在这里插入图片描述

  • next()与nextLine()

next():是不可以录入空格的。它会自动忽略有效字符之前的空格,当遇到有效字符后开始录入,在遇到空格/tab键时停止录入,只录入空格前面的东西,空格后面的东西(包括分隔的空格都会保留在缓存区域),遇到回车键会结束录入

nextLine():可以录入空格。录入遇到回车键之前的所有字符,回车键表示结束录入

示例

import java.util.Scanner ;  // 导包

public class ScannerTest {
    public static void main(String[] args) {
        // 创建输入对象
        Scanner scan = new Scanner(System.in) ;

        System.out.print("nextLine():请输入一个字符串:");
        String str1 = scan.nextLine() ;
        System.out.print("next():请输入一个字符串:");
        String str2 = scan.next() ;

        System.out.println("nextLine() : " + str1);
        System.out.println("next() : " + str2);

        scan.close();
    }
}

在这里插入图片描述

3.4 分支语句

3.4.1单分支条件判断:if

  • if语句第一种格式:if
if(条件表达式) {
	语句体	// 关系表达式返回值为true才会执行
}

执行流程:

  1. 首先判断条件表达式看其结果是true还是false

  2. 如果是true,则执行语句体

  3. 如果是false就不执行语句体

在这里插入图片描述
案例:输入考试成绩,成绩大于90分奖励100元,然后结束;成绩不大于90,直接结束

import java.util.Scanner;

public class IfTest {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in) ;
        System.out.print("考试分数:");
        int i = scanner.nextInt();

        if(i >= 90) {
            System.out.println("奖励100元钱");
        }

        System.out.println("结束");
        scanner.close();
    }
}

在这里插入图片描述

3.4.2 双分支条件判断:if…else

  • if语句的第二种格式:if...else
if(关系表达式) { 
  	语句体1;// 关系表达式返回值为true 执行语句体1
}else {
  	语句体2;// 关系表达式返回值为false 执行语句体2
}
* 执行流程

	1. 首先判断关系表达式看其结果是true还是false

	2. 如果是true就执行语句体1

	3. 如果是false就执行语句体2

在这里插入图片描述

案例:从键盘输入一个数,判断其是奇数还是偶数

import java.util.Scanner;

public class IfElseTest {
    public static void main(String[] args) {
        Scanner s = new Scanner(System.in) ;
        System.out.print("请输入一个数字:");
        int i = s.nextInt();

        if(i % 2 == 0) {
            System.out.println(i + "是偶数");
        } else {
            System.out.println(i + "是奇数");
        }
        System.out.println("结束");
      	
      	s.close();
    }
}

在这里插入图片描述

3.4.3 多分支条件判断:if…else if

  • if语句第三种格式: if...else if ...else
if (判断条件1) {
  	执行语句1;
} else if (判断条件2) {
  	执行语句2;
}
...
}else if (判断条件n) {
 	执行语句n;
} else {
  	执行语句n+1;// 以上条件全不满足,则执行else语句
}
* 执行流程

	1. 首先判断关系表达式1看其结果是true还是false

	2. 如果是true就执行语句体1,然后结束当前多分支

	3. 如果是false就继续判断关系表达式2看其结果是true还是false

	4. 如果是true就执行语句体2,然后结束当前多分支

	5. 如果是false就继续判断关系表达式…看其结果是true还是false

	6. …

	7. 如果没有任何关系表达式为true,就执行语句体n+1,然后结束当前多分支。

在这里插入图片描述
案例:通过指定考试成绩,判断学生等级,成绩范围[0,100]

  • 90-100 优秀

  • 80-89 好

  • 70-79 良

  • 60-69 及格

  • 60以下 不及格

import java.util.Scanner;

public class IfElseIfTest {
    public static void main(String[] args) {
        Scanner s = new Scanner(System.in) ;

        System.out.print("请输入考试成绩:");
        int score = s.nextInt();

        if(score < 0 || score > 100) {
            System.out.println("成绩错误");
        } else if(score >= 90 && score <= 100) {
            System.out.println("你的成绩属于A");
        }else if(score>=80 && score<90){
            System.out.println("你的成绩属于B");
        }else if(score>=70 && score<80){
            System.out.println("你的成绩属于C");
        }else if(score>=60 && score<70){
            System.out.println("你的成绩属于D");
        }else {
            System.out.println("你的成绩属于E");
        }
        s.close();
        System.out.println("结束");
    }
}

在这里插入图片描述

import java.util.Scanner;

public class IfElseIfTest {
    public static void main(String[] args) {
        Scanner s = new Scanner(System.in) ;

        System.out.print("请输入考试成绩:");
        int score = s.nextInt();

        if(score < 0 || score > 100) {
            System.out.println("成绩错误");
        } else if(score >= 90 && score <= 100) {
            System.out.println("你的成绩属于A");
        }else if(score>=80 && score<90){
            System.out.println("你的成绩属于B");
        }else if(score>=70 && score<80){
            System.out.println("你的成绩属于C");
        }else if(score>=60 && score<70){
            System.out.println("你的成绩属于D");
        }else {
            System.out.println("你的成绩属于E");
        }
        s.close();
        System.out.println("结束");
    }
}

上面的两种方式都能达到指定的效果,第一种方式各个条件之间没有交集,各个顺序可以调换(除else语句),第二种方式各个范围存在交集,顺序不能调换,范围小的在上,范围大的在下

3.4.4 if…else嵌套

在if的语句块中,或者是在else语句块中, 又包含了另外一个条件判断(可以是单分支、双分支、多分支)
执行的特点:
(1)如果是嵌套在if语句块中的 只有当外部的if条件满足,才会去判断内部的条件
(2)如果是嵌套在else语句块中的 只有当外部的if条件不满足,进入else后,才会去判断内部的条件

案例:获取三个数据中的最大值

public class IfIfTest {
    public static void main(String[] args) {
        int a = 10 ;
        int b = 20 ;
        int c = 30 ;

        if(a > b) {
            if(a > c) {
                System.out.println(a + "是最大值");
            } else {
                System.out.println(c + "是最大值");
            }
        } else {
            if(b > c) {
                System.out.println(b + "是最大值");
            } else {
                System.out.println(c + "是最大值");
            }
        }
    }
}

在这里插入图片描述

3.4.5 switch…case多分支选择结构

  • 语法格式:

[]中括号代表可省略

switch(表达式){
    case 常量值1:
        语句块1;
        [break;]// 遇到break,结束当前case语句 
    case 常量值2:
        语句块2;
        [break;]   
    ...
   [default:
        语句块n+1;//如果上述的常量值与case均不匹配,则执行本代码
        [break;]
   ]
}
switch表达式的取值:byte,short,char,int
JDK5以后可以是枚举
JDK7以后可以是String
  • switch表示这是switch语句
    表达式的取值:byte,short,char,int
    JDK5以后可以是枚举
    JDK7以后可以是String
  • case后面跟的是要和表达式进行比较的值
  • 语句体部分可以是一条或多条语句
  • break表示中断,结束的意思,可以结束switch语句
  • default语句表示所有情况都不匹配的时候,就执行该处的内容,和if语句的else相似

执行过程:

先计算表达式的值,
然后和case后面的匹配,
如果有就执行对应的语句,否则执行default控制的语句
直到遇到break或者右大括号},结束switch语句。

在这里插入图片描述

  • 案例:从键盘输入星期的整数值,输出星期的英文单词
import java.util.Scanner;

public class SwitchTest {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in) ;
        System.out.print("请输入星期值:");
        int weekday = scanner.nextInt();

        // switch语句
        switch (weekday) {
            case 1 :
                System.out.println("Monday");
                break;
            case 2 :
                System.out.println("Tuesday");
                break;
            case 3 :
                System.out.println("Wednesday");
                break ;
            case 4 :
                System.out.println("Thursday");
                break ;
            case 5 :
                System.out.println("Friday");
                break;
            case 6 :
                System.out.println("Saturday");
                break;
            case 7 :
                System.out.println("Sunday");
                break;
            default :
                System.out.println("输入错误");
                break;
        }
        scanner.close();
    }
}

在这里插入图片描述

  • case的穿透性

在switch语句中,如果case的后面不写break,将出现穿透现象,也就是一旦匹配成功,不会在判断下一个case的值,直接向后运行,直到遇到break或者整个switch语句结束,switch语句执行终止。

示例:

import java.util.Scanner;

public class SwitchTest {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in) ;
        System.out.print("请输入星期值:");
        int weekday = scanner.nextInt();

        // switch语句
        switch (weekday) {
            case 1 :
                System.out.println("Monday");
            case 2 :
                System.out.println("Tuesday");
            case 3 :
                System.out.println("Wednesday");
            case 4 :
                System.out.println("Thursday");
            case 5 :
                System.out.println("Friday");
            case 6 :
                System.out.println("Saturday");
            case 7 :
                System.out.println("Sunday");
            default :
                System.out.println("输入错误");
        }
        scanner.close();
    }
}

在这里插入图片描述

  • 利用case的穿透性

案例:根据指定的月份输出对应的季节

import java.util.Scanner;

public class SwitchTest1 {
    public static void main(String[] args) {
        /*
        根据指定的月份输出对应的季节
        3、4、5  春季
        6、7、8  夏季
        9、10、11 秋季
        12、1、2  冬季
        */

        Scanner sc = new Scanner(System.in) ;
        System.out.print("请输入月份:");
        int mouth = sc.nextInt();

        switch (mouth) {
            case 1 :
                System.out.println(mouth + "月份是冬季");
                break;
            case 2 :
                System.out.println(mouth + "月份是冬季");
                break;
            case 3 :
                System.out.println(mouth + "月份是春季");
                break;
            case 4 :
                System.out.println(mouth + "月份是春季");
                break;
            case 5 :
                System.out.println(mouth + "月份是春季");
                break;
            case 6 :
                System.out.println(mouth + "月份是夏季");
                break;
            case 7 :
                System.out.println(mouth + "月份是夏季");
                break;
            case 8 :
                System.out.println(mouth + "月份是夏季");
                break;
            case 9 :
                System.out.println(mouth + "月份是秋季");
                break;
            case 10 :
                System.out.println(mouth + "月份是秋季");
                break;
            case 11 :
                System.out.println(mouth + "月份是秋季");
                break;
            case 12 :
                System.out.println(mouth + "月份是冬季");
                break;
            default:
                System.out.println("月份有误");
                break;
        }
		sc.close();
    }
}

在这里插入图片描述
改进:

import java.util.Scanner;

public class SwitchTest1 {
    public static void main(String[] args) {
        /*
        根据指定的月份输出对应的季节
        3、4、5  春季
        6、7、8  夏季
        9、10、11 秋季
        12、1、2  冬季
        */

        Scanner sc = new Scanner(System.in) ;
        System.out.print("请输入月份:");
        int mouth = sc.nextInt();

        switch (mouth) {
            case 12 :
            case 1 :
            case 2 :
                System.out.println(mouth + "是冬季");
                break;
            case 3 :
            case 4 :
            case 5:
                System.out.println(mouth + "是春季");
                break;
            case 6:
            case 7:
            case 8:
                System.out.println(mouth + "是夏季");
                break;
            case 9 :
            case 10 :
            case 11 :
                System.out.println(mouth + "是秋季");
                break;
            default:
                System.out.println("月份输入有误");
                break;
        }
        sc.close();
    }
}

在这里插入图片描述

* 选择结构switch语句的注意事项

1. case后面只能是常量,不能是变量,而且,多个case后面的值不能出现相同的。

2. default可以省略。但是不建议省略。因为它的作用是对不正确的情况给出提示。除非判断的值是固定的。

3. break可以省略,但一般不建议。省略case会出现case穿透。一般不省略,根据需求判断是否需要省略

4. default的位置不一定要在最后,可以出现在switch语句任意位置。但是建议在最后。

5.switch语句的结束条件:

	* 遇到break

	* 执行到程序的末尾,即执行到switch的右大括号就结束了

if语句与switch语句比较

if语句的条件是一个布尔类型值,if条件表达式为true则进入分支,可以用于范围的判断,也可以用于等值的判断,使用范围更广。

* switch语句的条件是一个常量值(byte,short,int,char,枚举,String),只能判断某个变量或表达式的结果是否等于某个常量值,使用场景较狭窄。

* 当条件是判断某个变量或表达式是否等于某个固定的常量值时,使用if和switch都可以,习惯上使用switch更多。当条件是区间范围的判断时,只能使用if语句。

* 另外,使用switch可以利用穿透性,同时执行多个分支,而if...else没有穿透性。

案例:用year、month、day分别存储今天的年、月、日值,然后输出今天是这一年的第几天。

public class Test1 {
    public static void main(String[] args) {
        /*
        用year、month、day分别存储今天的年、月、日值,
        然后输出今天是这一年的第几天。
         */
        int year = 2022 ;
        int mouth = 7 ;
        int day = 20 ;

        int days = 0 ;

        switch (mouth) {
            case 12 :
                days += 30 ; // 11月份满月的天数
            case 11 :
                days += 31 ;
            case 10 :
                days += 30 ;
            case 9 :
                days += 31 ;
            case 8 :
                days += 31 ;
            case 7 :
                days += 30 ;
            case 6 :
                days += 31 ;
            case 5 :
                days += 30 ;
            case 4 :
                days += 31 ;
            case 3 :
                if(year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
                    days += 29 ;
                } else {
                    days += 28 ;
                }
            case 2 :
                days += 31 ;
            case 1 :
                days += day ;
        }

        System.out.println(year + "年的" + mouth + "月的第" + day + "天是该年的第" + days + "天");
    }
}

在这里插入图片描述

3.5 循环语句

  • 循环语句

循环语句可以在满足循环条件的情况下,反复执行某一段代码,这段被重复执行的代码被称为循环体语句,当反复执行这个循环体时,需要通过修改循环变量使得循环判断条件为false,从而结束循环,否则循环将一直执行下去,形成死循环。

循环语句的组成

    1.初始化语句:

		* 一条或者多条语句,这些语句完成一些初始化操作。

    2.判断条件语句:

		* 这是一个boolean 表达式,这个表达式能决定是否执行循环体。

	3. 循环体语句:


		* 这个部分是循环体语句,也就是我们要多次做的事情。

	4. 控制条件语句:

		* 这个部分在一次循环体结束后,下一次循环判断条件执行前执行。通过用于控制循环条件中的变量,使得循环在合适的时候结束。

3.5.1 循环语句的分类

  • for
  • while
  • do…while

3.5.2 循环结构for语句的格式和基本使用

  • for循环语句格式:
for(初始化语句①; 循环条件语句②; 循环控制条件语句④){
	循环体语句③
}

注意:
(1)for(;;)中的两个是不能多也不能少
(2)循环条件必须是boolean类型

执行流程:

第一步:执行初始化语句①,完成循环变量的初始化;

第二步:执行循环条件语句②,看循环条件语句的值是true,还是false;
- 如果是true,执行第三步;
- 如果是false,循环语句中止,循环不再执行。

第三步:执行循环体语句③

第四步:执行循环控制条件语句④,针对循环变量重新赋值

第五步:根据循环变量的新值,重新从第二步开始再执行一遍

在这里插入图片描述

  • 案例:使用for循环输出10遍"HelloWorld"
public class ForTest {
    public static void main(String[] args) {
        for(int i = 0 ; i < 10 ; i ++) {
            System.out.println("HelloWorld");
        }
    }
}

在这里插入图片描述

  • 案例:求1-100的累加和
public class ForTest {
    public static void main(String[] args) {
        int num = 0 ;
        for(int i = 1 ; i <= 100 ; i ++) {
            num += i ;
        }
        System.out.println("1-100的累加和为:" + num);
    }
}

在这里插入图片描述

  • 案例:求100-999的水仙花数

水仙花数就是个位、十位、百位的三次方的和相加等于该数
如:153 = 111 + 555 + 333 = 1 + 125 + 27 = 153

public class ForTest {
    public static void main(String[] args) {
        
        // 求100-999之间的水仙花数
        int bits ;
        int ten ;
        int hundredth ;

        for (int i = 100 ; i <= 999 ; i ++) {
            bits = i % 10 ;
            ten = i / 10 % 10 ;
            hundredth = i / 100 ;

            if(bits * bits * bits + ten * ten * ten + hundredth * hundredth * hundredth == i) {
                System.out.println(i + "是水仙花数");
            }
        }
    }
}

在这里插入图片描述

3.5.3 循环结构while语句的格式和基本使用

  • while循环语句基本格式:
while(①判断条件语句) {
	②循环体语句;
	控制条件语句;
}

// while()中的循环条件不能为空
执行流程:
第一步:执行循环条件语句①,看循环条件语句的值是true,还是false;
	* 如果是true,执行第二步;
	* 如果是false,循环语句中止,循环不再执行。

第二步:执行循环体语句②;

第三步:循环体语句执行完后,然后重新从第一步开始再执行一遍

在这里插入图片描述

  • 案例:在控制台输出数据1-10
public class WhileTest {
    public static void main(String[] args) {
        int i = 1 ;
        while (i <= 10) {
            System.out.println(i);
            i ++ ;
        }
    }
}

在这里插入图片描述

3.5.4 循环结构do…while语句的格式和基本使用

  • 基本格式
do {
    循环体语句①;
} while (循环条件语句②)
  • 完整格式
初始化语句;
do {
	循环体语句;
	控制条件语句;
}while(判断条件语句);

注意:
(1)while(循环条件)中循环条件必须是boolean类型
(2)do{}while();最后有一个分号
(3)do...while结构的循环体语句是至少会执行一次,这个和for和while是不一样的

执行流程
- 第一步:执行循环体语句①;

- 第二步:执行循环条件语句②,看循环条件语句的值是true,还是false;
	如果是true,执行第三步;
	如果是false,循环语句终止,循环不再执行。
	
- 第三步:循环条件语句执行完后,重新从第一步开始再执行一遍
  • 案例:输出1-10
public class DoWhileTest {
    public static void main(String[] args) {
        int i = 1 ;
        do {
            System.out.println(i);
            i ++ ;
        }while (i <= 10) ;
    }
}

在这里插入图片描述

3.5.5 循环结构三种循环语句的区别

* 从循环次数角度分析

	* do...while循环至少执行一次循环体语句

	* for和while循环先循环条件语句是否成立,然后决定是否执行循环体语句

* 如何选择

	* 遍历有明显的循环次数(范围)的需求,选择for循环

	* 遍历没有明显的循环次数(范围)的需求,循环while循环

	* 如果循环体语句块至少执行一次,可以考虑使用do...while循环

	* 本质上:三种循环之间完全可以互相转换,都能实现循环的功能

3.5.6 循环结构之死循环

  • 两种最简单的死循环格式
for(;;){...}
while(true){...}
  • for的三种死循环
for(;;) {
    System.out.println(1);
}


for(;2>1;) {
    System.out.println(1);
}



for(int i = 0 ; i <= 10 ;) {
     System.out.println(1);
}
  • while/do…while死循环
while (true) {
     System.out.println(1);
}


do {
   System.out.println(1);
}while (true) ;

3.5.6 循环嵌套

  • 嵌套循环

两个for嵌套循环格式

for(初始化语句①; 循环条件语句②; 控制语句⑦) {
    for(初始化语句③; 循环条件语句④; 控制语句⑥) {
      	循环体语句⑤;
    }
}
  • 案例:打印5行‘*’符拼成直角三角形
public class ForForTest {
    public static void main(String[] args) {
        for(int i = 1 ; i <= 5 ; i ++) {
            for(int j = 1 ; j <= i ; j ++) {
                System.out.print('*');
            }
            System.out.println();
        }
    }
}

在这里插入图片描述

  • 案例:输出99乘法表
public class ForForTest {
    public static void main(String[] args) {

        for(int i = 1 ; i <= 9 ; i ++) {
            for(int j = 1 ; j <= i ; j ++) {
                System.out.print(j + " * " + i + " = " + i * j + "\t");
            }
            System.out.println();
        }
    }
}

在这里插入图片描述

3.5.7 控制跳转语句 break

  • break含义:退出、结束
  • 使用场景
    • switch语句中
    • 循环语句中
  • 案例:在for循环中使用,当第四次循环时结束
public class ForTest {
    public static void main(String[] args) {
        for (int i = 0 ; i < 10 ; i ++) {
            if(i == 4) {
                break;
            }
            System.out.println(i);
        }
    }
}

在这里插入图片描述

3.5.8 控制跳转语句 continue

  • continue含义:退出本次循环,继续下次循环

案例:在for循环中跳出第四次循环

public class ForTest {
    public static void main(String[] args) {
        for (int i = 0 ; i < 10 ; i ++) {
            if(i == 4) {
                continue;
            }
            System.out.println(i);
        }
    }
}

在这里插入图片描述

3.5.8 控制跳转语句 return

  • return

    • 返回(如果方法有返回值,结束的时候讲返回值传递给调用者)
    • 用于方法的结束
  • return和break以及continue的区别?

    • return是结束方法
    • break是跳出循环
    • continue是终止本次循环继续下次循环

案例:

public class ForTest {
    public static void main(String[] args) {
        for (int i = 0 ; i < 10 ; i ++) {
            if(i == 4) {
                return;
            }
            System.out.println(i);
        }
        System.out.println("结束");
    }
}

在这里插入图片描述

3.6 方法的定义和使用

3.6.1 方法的作用

提高代码的复用性

3.6.2 什么是方法?

方法就是用来完成特定功能的代码块
方法也叫函数,是一组代码语句的封装,从而实现代码的重用,减少代码冗余。

3.6.3 方法的格式

没有参数的方法:

修饰符 返回值类型 方法名() {
	方法体语句;
}


有参数的方法:

修饰符 返回值类型 方法名(参数类型 参数名1,参数类型 参数名2) {
	方法体语句;
    return 返回值;
}
  • 方法声明的位置:方法必须声明在类体内方法体外,不能在一个方法中定义另外一个方法中。

3.6.4 方法的格式说明

* 修饰符:
    修饰符是可选的,当前所学的就只有public static public表示访问权限,static表示这个方法是静态的,其在类加载时将和类一起加载进内存。

* 返回值类型:
   -  没有返回值设置返回值类型位 void
   -  有返回值则设置返回值类型为 基本数据类型/引用数据类型

* 方法名
    方法名的命名规则:除第一个单词的首字母小写外,其余单纯首字母大写,驼峰命名法。做到见名知意

* 参数列表
    - 形式参数:在定义方法时方法名后面括号中声明的变量称为形式参数(形参),用于接收实际参数。
    - 实际参数:调用方法时方法名后面括号中传递的值/变量/表达式 称为实际参数(实参),就是实际参与方法运算的值。

一个方法无论是否有参数,声明和调用时括号 () 都不能丢弃,多个参数之间用逗号 , 隔开
  • 参数类型:参数的数据类型

  • 参数名:参数的变量名

  • 方法体:为完成指定工能的代码块

  • return:表示结束方法

  • 返回值:返回方法执行后的结果,由return带个调用者

    • 如果被调用的的方法的返回值类型是void,没有返回值,不需要也不能处理和接收返回值结果。

    • 如果被调用的的方法的返回值类型不是void,有返回值

      • 返回结果可以作为赋值表达式的值
      • 返回结果可以作为计算表达式的一个操作数
      • 返回结果可以作为另一个方法调用的实参
    • 对于方法调用表达式的结果可以不接受和处理,直接在后面加分号 ; 成为一个独立的语句,这种情况属于返回值丢失。

3.6.5 方法的定义和调用

- 定义方法需要明确的内容
    * 明确返回值类型
    * 明确参数列表

案例:定义一个方法,求两个整数之和

public class MethodTest {
    public static void main(String[] args) {
        // 调用twoNumAdd()方法,并将其返回值赋给num
        int num = twoNumAdd(5 , 9) ;
        System.out.println(num);
    }

    /**
     * 求两个整数的和
     * @param a 参数a
     * @param b 参数b
     * @return  返回a和b的和
     */
    public static int twoNumAdd(int a , int b) {
        return a + b;
    }
}

在这里插入图片描述

  • 方法的执行流程
    在这里插入图片描述

    • 注意事项:

        - 方法不调用不执行
      
        - 方法与方法是平级关系,不能嵌套定义
      
        - 定义方法时,多个参数之间使用逗号隔开
      
        - 方法调用时传递参数不用再传递数据类型
      
        - 如果方法有明确的返回值,一定要使用return带回一个值
      
  • 案例:键盘输入两个数据,返回两个数中的较大值

import java.util.Scanner;

public class MethodTest1 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in) ;
        System.out.print("请输入第一个数:");
        int a = sc.nextInt();
        System.out.print("请输入第二个数:");
        int b = sc.nextInt();
        // 调用max()方法
        int max = max(a, b);

        System.out.println(max);
        sc.close();
    }

    /**
     * 比较两个数的大小,并返回较大的一个数的值
     * @param a
     * @param b
     * @return  返回较大值
     */
    public static int max(int a , int b) {

        /*int max ;
        if(a > b) {
            max = a ;
        } else {
            max = b ;
        }
        return max ;*/

        if(a > b) {
            return a ;
        } else {
            return b ;
        }

        // return (a > b) ? a : b ;

    }
}

在这里插入图片描述

3.6.6 方法重载概述和基本使用

重载在同一个类中,方法名必须相同,参数列表必须不同,与返回值类型无关

* 参数列表不同的表现

	* 参数的个数不同
	* 参数的类型不同
	* 参数的顺序不同(实际开发中不用)


* 重载方法调用:JVM通过方法的参数列表,调用匹配的方法

	* 先找到个数、类型最匹配的
	* 再找个数和类型都可以兼容的

我们在之前的学习中,经常用到重载方法println()
在这里插入图片描述
案例:
* 定义一个方法求两个整数的和
* 定义一个方法求两个浮点数的和
* 定义一个方法求三个整数的和

public class MethodReloadTest {
    public static void main(String[] args) {
        System.out.println(add(1 , 3));
        System.out.println(add(3.14 , 5.3));
        System.out.println(add(1 , 2 , 3));
    }

    /**
     * 两个整数之和
     * @param a
     * @param b
     * @return
     */
    public static int add(int a , int b) {
        return a + b;
    }

    /**
     * 两个浮点数之和
     * @param a
     * @param b
     * @return
     */
    public static double add(double a , double b) {
        return a + b ;
    }

    /**
     * 三个整数之和
     * @param a
     * @param b
     * @param c
     * @return
     */
    public static int add(int a , int b , int c) {
        return a + b + c ;
    }

}

在这里插入图片描述

3.6.7 方法的递归调用

  • 方法的递归
    • 方法自己调用自己的现象称为递归

从前有座山,山上有座庙,庙里有个老和尚喜欢给小和尚讲故事,故事的内容是从前有座山,山上有座庙,庙里有个老和尚喜欢给小和尚讲故事,故事的内容是…

  • 递归的分类:
    • 直接递归:方法自己调用自己
    • 间接递归:A调用B,B调用C,C调用A

注意事项:

  • 递归一定要有条件限制,保证递归能够在一定条件下停止,否则会报错(栈内存溢出)

  • 在递归中虽然有限定条件,但是递归深度不能太深,否则效率低下,或者也会发生栈内存溢出。

案例:计算出10的阶乘

public class RecursionTest {
    public static void main(String[] args) {
        System.out.println(fun(5));
    }

    private static int fun(int a) {
        if(a == 1) {
            return 1 ;
        } else {
            return a * fun(a - 1) ;
        }
    }
}

在这里插入图片描述

fun(5) = 
  5 * fun(4) = 
  5 * 4 * fun(3) = 
  5 * 4 * 3 * fun(2) = 
  5 * 4 * 3 * 2 * fun(1) = 
  5 * 4 * 3 * 2 * 1
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值