2.流程控制和Java方法(狂神说)

流程控制

用户交互Scanner

  • 之前我们学的基本语法并没有实现程序和人的交互,Java给我们提供了一个工具类,可以获取用户的输入java.util.Scanner是Java5的新特征,我们通过Scanner类来获取用户的输入。
  • 基本语法
Scanner s = new Scanner(System.in);
  • 通过Scanner类的 next()与 nextLine()方法获取用户的字符串,读取前一般用hasNext()与hasNextLine()判断是否还有输入的数据。
//创建一个扫描器对象
Scanner scanner = new Scanner(System.in);

System.out.println("使用next方式接收");
//判断用户有没有输入字符串
if(scanner.hasNext()){  //使用hasNextLie()会接收一行 "hello word"
    //使用next方式接收
    String str = scanner.next(); 
    System.out.println("输入的内容为:"+str);
    //input: hello word
    //输入的内容为:hello
}
//凡是属于IO流的类如果不关闭会一直占用资源
scanner.close();

next()

  1. 一定要读取到有效字符才可以结束输入
  2. 对输入有效字符之前遇到的空白,next()方法会将其去掉
  3. 只有输入有效字符后才将其后面输入的空白作为结束符
  4. next()不能得到带有空格的字符串

nextLine()

  1. Enter作为结束符,即返回输入回车之前所有的字符
  2. nextLine()可以获取空白
//从键盘接收数据
Scanner scanner = new Scanner(System.in);
System.out.println("请输入数据:");

String str = scanner.nextLine();
System.out.println("输入的内容为:"+str);
scanner.close();
System.out.println("请输入整数:");
if(scanner.hasNextInt()){
    int i=scanner.nextInt();
    System.out.println("输入的整数为:"+i);
}else {
    System.out.println("输入的不是整数数据");
}

顺序结构

  • Java的基本结构就是顺序结构,除非特别指明,否则就按语句一条一条执行。
  • 顺序结构是最简单的算法结构。
  • 语句语句之间是按从上到下执行的,它是由若干个依次执行的处理步骤组成的,它是如何一种算法都离不开的一种基本算法结构。

选择结构

  • if单选择结构 if( )
  • if双选择结构 if( ){ }else
  • if多选择结构 if( ){ }else if{ }else{}
  • 嵌套的if结构 if( )
int a = 80;
if(a>60){
    System.out.println("及格");
    if(a>80) System.out.println("且优秀");
}else if(a>0){
    System.out.println("不及格");
}else {
    System.out.println("缺考");
}

switch多选择结构

char grade = 'C'; //JDK新特性 可以是字符串(字符本质还是数字)
switch (grade){
    case 'A':
        System.out.println("优秀");
        break; //可选,跳出当前结构
    case 'B':
        System.out.println("良好");
        break;
    case 'C':
        System.out.println("合格");
        break;
    default: //默认,以上值没匹配到
        System.out.println("不及格");
        break;
}

循环结构

  • while循环
//计算1+2+3+...+100
int i=0;
int sum=0;
while(i<100){
    i++;
    sum+=i;
}
System.out.println(sum); //5050
  • do…while循环
//先执行后判断,至少执行一次
do{
    i++;
    sum+=i;
}while(i<100) //跟上面效果一样
  • for循环
//(初始化;条件判断;迭代)
for(int i=0;i<100;i++){
    i++;
    sum+=i;
}
for(; ; ){...} //死循环
  • 增强for循环
int [] numbers = {10,20,30,40,50}; //定义一个数组
for (int x:numbers){
    System.out.println(x); //遍历数组的元素 10 20 30 40 50
}
//相当于
for(int i=0;i<5;i++){
    System.out.println(numbers[i]);
}

break & continue

  • break可用在任何循环的主体部分,由于强行退出循环,也可以用在switch语句。
  • continue用于循环语句中,终止某次循环过程,跳过剩余语句,之间进行下一次循环条件判断。
  • 标签:后面跟一个冒号的标识符 label:
//打印101-150之间所有的质数
int count = 0;
outer:for(int i=101;i<=150;i++){
    for (int j=2;j<i/2;j++){
        if(i%j==0)
            continue outer; //不建议使用标签
    }
    System.out.print(i+" ");
}

Java方法

方法的定义

  • Java的方法类似与其他语言的函数,是一段用来完成特定功能的代码片段
  • 方法包含一个方法头和一个方法体
    • 修饰符:可选,定义了方法的访问类型,告诉编译器如何调用该方法。
    • 返回值类型:方法可能会返回值。returnValueType是方法返回值的数据类型。有些方法没有返回值,则returnValueType为关键字void。
    • 方法名:是方法的实际名称,方法名与参数表共同构成方法签名。
    • 参数类型:像一个占位符。方法被调用时,传递值给参数,该值称为实参或变量。参数列表是指方法的参数类型、顺序和参数个数。参数是可选的,方法可以不包含任何参数。
      • 形式参数:在方法被调用时用于接收外界输入的数据。
      • 实参:调用方法时实际传给方法的数据。
    • 方法体:方法体包含具体的语句,定义该方法的功能。
修饰符 返回值类型 方法名(参数类型 参数名,...){
   方法体...
   return 返回值;
}

方法的调用

  • 调用方法:对象名.方法名(实参列表)。
  • Java支持两种调用方法的方式,根据方法是否返回值来选择。
  • 当方法返回一个值的时候,方法调用通常被当成一个值
int larger = max(30,40);
  • 如果方法返回值是void,方法调用一定是一条语句。

  • 扩展:值传递和引用传递 ( Java都是值传递)。

  • 调用其他类的方法,除非是static静态方法,不然必须实例化这个类(new)

    public class Demo01 {
       
        public static void main(String[] args) {
            int add = Demo01.add(1,2); // 通过类名直接调用静态方法
            System.out.println(add); // 3
        }
    	// static静态方法,否则就要new实例化来调用
        public static int add(int a,int b){
            return a+b;
        }
    }
    

    方法的重载

  • 重载是在一个类中,有相同的方法名,参数列表不同的方法。

  • 方法重载的规则:

    • 方法名称必须相同
    • 参数列表必须不同(个数、参数类型、或排序不同)
    • 返回类型可以相同也可以不相同
    • 仅仅返回类型不同不足以成为方法的重载

可变参数

  • Jdk1.5开始,Java支持传递同类型的可变参数给一个方法。
  • 在方法声明中,在指定参数类型后加一个省略号 (…)。
  • 一个方法中只能指定一个可变参数,它必须是方法的最后一个参数。
//打印最大值
public static void printMax(int... num){
    if(num.length==0){
        System.out.println("没有值传入");
        return;
    }
    int result = num[0];
    for (int i = 1; i < num.length; i++) {
        if(num[i] > result){
            result = num[i];
        }
    }
    System.out.println("最大值是:"+result);
}
public static void main(String[] args) {
    printMax(1,2,3,4); //最大值是:4
    printMax(new int[]{1,2,3,4,5}); //最大值是:5
}

递归

  • 递归就是:A方法调用A方法,自己调用自己!
  • 递归策略只需少量的代码可描述解题过程中多次重复计算,大大减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。
  • 递归结构
    • 递归头:什么时候不调用自身方法,没有头 将陷入死循环。
    • 递归体:什么时候需要调用自身方法。
//阶乘 n! n*(n-1)*...*2*1
public static int f(int n){
    if(n==1) return 1;
    return n*f(n-1); //递归:调用自身
}
public static void main(String[] args) {
    System.out.println(f(5)); //5!= 120
}
posted @ 2021-07-29 10:12  木兮君  阅读(44)  评论(0)    收藏  举报