Java基础语法(二)

Java基础语法(二)

合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。 ——《道德经》

十、用户交互 Scanner 类(引用数据类型)

  1. Java 5 后引入 java.util.Scanner 这一个包,我们可以通过 Scanner 这一个类来获取用户的输入

  2. 基本语法:

    import java.util.Scanner;	//使用Scanner需要先导包
    	......
    	Scanner scanner = new Scanner(System.in);
    
  3. 通过 Scanner 类的 next() 和 nextLine() 方法获取输入的字符串,在读取前一般需要使用 hasNext() 或 hasNextLine() 判断是否还有输入的数据

    next():
    1.一定要读取到有效字符后才能结束输入。
    2.对输入有效字符之前遇到的空白,next()方法会自动将其去掉。
    3.只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符。
    4.next()不能得到带有空格的字符串!
    
    nextLine():
    1.以 Enter 为结束符,即nextLine()方法返回的是输入回车之前的所有字符。
    2.nextLine()可以获取空白!
    
  4. 用完 Scanner (或者其他 IO 流的类),如果不关闭会一直占用资源,所以用完就关闭是一个好习惯。

    关闭 Scanner:

    	Scanner s = new Scanner(System.in);
    	......
        s.close();	//关闭 Scanner
    
  5. Scanner 的进阶使用。

    hasNext()		:用来是否还有输入的字符串
    next() 			:用来接受控制台录入的字符串
    
    hasNextInt()	:用来是否还有输入的整数
    nextInt() 		:用来接受控制台录入的整数
    
    hasNextFloat()	:用来是否还有输入的浮点数
    nextFloat() 	:用来接受控制台录入的浮点数
    
    hasNextDouble()	:用来是否还有输入的浮点数
    nextDouble() 	:用来接受控制台录入的浮点数
    
    

其中,hasNextFloat() 和 hasNextDouble() 功能基本相同,但特别的是,当控制台输入的不管是小数还是整数,这两个方法的结果都返回 true ,并且会把输入的整数变成小数。

而 hasNextInt() 只有在控制台输入的是整数才返回 true

import java.util.Scanner;

public class demo01 {

    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);

        int i = 0;
        double d = 0.0;

        if(scanner.hasNextInt()){
            i = scanner.nextInt();
            System.out.println("i = "+i);
        }else{
            System.out.println("输入的不是整数!");
        }

        if(scanner.hasNextDouble()){
            d = scanner.nextDouble();
            System.out.println("d = "+d);
        }else{
            System.out.println("输入的不是小数!");
        }

        scanner.close();
    }
}
上述代码的三种结果:
1.输入整数:
20				//键盘输入
i = 20
20				//键盘输入
d = 20.0

2.输入小数:
3.14			//键盘输入
输入的不是整数!
d = 3.14

3.输入字符串(非数字)
hello			//键盘输入
输入的不是整数!
输入的不是小数!

结果分析:

1.输入整数:

当输入第一个20时,由于输入的是整数,第一个20被scanner.nextInt() 接收并赋值给 i 并输出 i = 20。

此时程序 scanner.hasNextDouble() 等待控制台再次输入,所以再次输入第二个20,被scanner.nextDouble() 接收并赋值给 d 并输出 d = 20.0。

2.输入小数:

输入 3.14 时,由于不是整数,无法被scanner.nextInt() 接收并赋值,所以输出 “ 输入的不是整数!”。

由于输入的 3.14还没被接收,所以会继续给scanner.nextDouble() 判断和接收。

3.输入字符串:

输入字符串 hello 时,在整个程序中,既没被scanner.nextInt() 接收也没被scanner.nextDouble() 接收。

原因分析:

为什么输入整数,scanner.nextDouble()返回 true 并且将整数转换为 double 类型的小数?

这就得对scanner.nextDouble()的源码进行分析。(按住Ctrl键+点击源程序的scanner.nextDouble()方法查看源代码)

Double.parseDouble()是把括号里面String类型的内容变成double类型。

也就是说,当我们在控制台输入整数20时,它在程序中会先被转换为String 类型的字符串赋值给 s ,接着通过Double.parseDouble()是把括号里面String类型的字符串 s 变成double类型然后返回,所以整数20就转换成了double类型的20.0。

为什么输入字符串,scanner.nextDouble()返回 false?

这是因为源代码中 catch 抛出了一个NumberFormatException(数字格式化异常),查看字符串里面夹杂着string或者其他类型。当输入字符串时,便会返回 false 。所以,我们在使用控制台手动输入小数时,不能在小数后面加上 F 或 D ,否则报错。但是在程序中定义数字则可以

十一、随机数类 Random(引用数据类型)(扩展)

Random类,它可以产生多种数据类型的随机数,在这里主要介绍生成整数与小数的方式。

  • public int nextInt(int maxValue) 产生 [0,maxValue) 范围的随机整数,包含0,不包含maxValue;

  • public double nextDouble() 产生 [0,1) 范围的随机小数,包含0.0,不包含1.0。

//Random 使用方法
import java.util.Random;	//导包

......
    //Random 变量名 = new Random();
    Random r = new Random();

例子:

import java.util.Random;

public class RandomDemo {
	public static void main(String[] args) {
		// 创建Random类的实例
		Random r = new Random(); 
		// 得到0-100范围内的随机整数,将产生的随机整数赋值给i变量
		int i = r.nextInt(100); 
		//得到0.0-1.0范围内的随机小数,将产生的随机小数赋值给d变量
		double d = r.nextDouble(); 
		System.out.println(i); 
		System.out.println(d); 
	}
}

十二、顺序结构

  • Java包含顺序结构、选择结构和循环结构。

  • Java的基本结构就是顺序结构,除非特别指明,否则就按照顺序一句一句执行。

  • 顺序结构是最简单的算法结构。

十三、选择结构

(一)if 条件语句

  • if 语句可以单独判断表达式的结果,如果满足某种条件就进行某种处理。

  • 语法:

    if(布尔表达式){
        //如果不二表达式为true执行的语句
    }
    
  • 图示:

  • 例子:

    	int a = 10;
    	
    	if(a > 10){
    		return true;
    	}
    	return false
    

(二) if ... else 条件语句

  • if 语句后面可以跟 else 语句,只有当 if 语句的布尔表达式值为 false 时,else 语句块才会被执行

  • 语法:

    if(布尔表达式){
        ......
       //如果布尔表达式的值为true执行的语句
    }else{
        ......
       //如果布尔表达式的值为false执行的语句
    }
    
  • 图示:

  • 例子:

    	int a = 10;
    	int b = 11;
    
    	if(a >= b){
    		System.out.println("a >= b");
    	}else{
        System.out.println("a < b");	
        }
    

(三)if ... else if ...多分支语句

  • if 语句后面可以跟 else if…else 语句,这种语句可以检测到多种可能的情况。

  • 使用 if,else if,else 语句的时候,需要注意下面几点:

    1. if 语句至多有 1 个 else 语句,else 语句在所有的 else if 语句之后。
    2. if 语句可以有若干个 else if 语句,它们必须在 else 语句之前。
    3. 一旦其中一个 else if 语句检测为 true,其他的 else if 以及 else 语句都将跳过执行
  • 语法:

    if(布尔表达式 1){
       //如果布尔表达式 1的值为true执行代码
    }else if(布尔表达式 2){
       //如果布尔表达式 2的值为true执行代码
    }else if(布尔表达式 3){
       //如果布尔表达式 3的值为true执行代码
    }else {
       //如果以上布尔表达式都不为true执行代码
    }
    
  • 图示:

  • 例子:

    public class Test {
       public static void main(String args[]){
          int grade = 80;
     
          if(grade >= 85){
             System.out.print("优秀");
          }else if(grade >= 75){
             System.out.print("良好");
          }else if(grade >= 60){
             System.out.print("及格");
          }else{
             System.out.print("不及格");
          }
       }
    }
    

(四)嵌套的 if 条件语句

  • 使用嵌套的 if…else 语句是合法的。也就是说可以在另一个 if 或者 else if 语句中使用 if 或者 else if 语句。

  • 语法:

if(布尔表达式 1){
   ////如果布尔表达式 1的值为true执行代码
   if(布尔表达式 2){
      ////如果布尔表达式 2的值为true执行代码
   }
}
  • 例子

    public class Test {
     
       public static void main(String args[]){
          int x = 30;
          int y = 10;
     
          if( x == 30 ){
             if( y == 10 ){
                 System.out.print("X = 30 and Y = 10");
              }
           }
        }
    }
    

(五)switch 多选择结构

  • switch case 语句判断一个变量与一系列值中某个值是否相等,每个值称为一个分支。

  • 语法:

    switch(表达式){
        case value1:
                ...		//执行语句
                break;	//可选
        case value2:
                ...		//执行语句
                break;	//可选
        ......
            
        default:
            ...   		//执行语句     
    }
    
  • switch case 语句有如下规则:

    1. switch 语句中的变量类型可以是: byte、short、int 或者 char。从 Java SE 7 开始,switch 支持字符串 String 类型了,同时 case 标签必须为字符串常量或字面量。
    2. switch 语句可以拥有多个 case 语句。每个 case 后面跟一个要比较的值和冒号。
    3. 当变量的值与 case 语句的值相等时,那么 case 语句之后的语句开始执行,直到 break 语句出现才会跳出 switch 语句。
    4. 当遇到 break 语句时,switch 语句终止。程序跳转到 switch 语句后面的语句执行。case 语句不必须要包含 break 语句。如果没有 break 语句出现,程序会继续执行下一条 case 语句,直到出现 break 语句。
    5. switch 语句可以包含一个 default 分支,该分支一般是 switch 语句的最后一个分支(可以在任何位置,但建议在最后一个)。default 在没有 case 语句的值和变量值相等的时候执行。default 分支不需要 break 语句。
  • 例子:

    public class Test {
       public static void main(String args[]){
          int i = 1;
          switch(i){
             case 0:
                System.out.println("0");
             case 1:
                System.out.println("1");
             case 2:
                System.out.println("2");
             case 3:
                System.out.println("3"); break;
             default:
                System.out.println("default");
          }
       }
    }
    
    /*
    输出为:
    1
    2
    3
    */
    
    

十四、循环结构

Java中有三种主要的循环结构:

  • while 循环
  • do…while 循环
  • for 循环

在 Java5 中引入了一种主要用于数组的增强型 for 循环。

(一)while 循环语句

  • while语句会反复地进行条件判断,只要条件成立,{ } 内的语句就会执行,直到条件不成立,while循环就结束。

  • 语法:

    while( 布尔表达式 ) {
      //循环内容
    }
    
  • 图示:

  • 例子:

    public class Test {
       public static void main(String[] args) {
          int x = 1;
          while( x < 4 ) {
             System.out.println("x = " + x );
             x++;
          }
       }
    }
    
    /*输出:
    x = 1
    x = 2
    x = 3 */
    

(二)do...while 循环语句

  • do…while 循环和 while 循环相似,不同的是,do…while 循环至少会执行一次
  • 语法:
do {
       //代码语句
}while(布尔表达式);

注意:布尔表达式在循环体的后面,所以语句块在检测布尔表达式之前已经执行了。 如果布尔表达式的值为 true,则语句块一直执行,直到布尔表达式的值为 false。

  • 图示:

  • 例子:

    public class Test {
       public static void main(String[] args){
          int x = 4;
     
          do{
             System.out.println("x = " + x );
             x——;
          }while( x > 0 );
       }
    }
    /*输出:
    x = 4
    x = 3
    x = 2
    x = 1  */
    

(三)for循环

  • for循环执行的次数是在执行前就确定的。语法格式如下:
for(初始化; 布尔表达式; 操作表达式) {
    //代码语句
}
  • 具体执行流程:

    for(one;two;three){
        four;
    }
    /*
    第一步,执行one
    第二步,执行two
    第三步,执行four
    第四步,执行three,然后重复执行第二步
    第五步,退出循环
    */
    
  • 例子:

    public class Test {
       public static void main(String[] args) {
     
          for(int x = 1; x < 4; x++) {
             System.out.println("x = " + x );
          }
       }
    }
    
    /*输出:
    x = 1
    x = 2
    x = 3	*/
    

(四)增强 for 循环

  • Java5 引入了一种主要用于数组或集合的增强型 for 循环。

  • 语法:

    for(声明语句 : 表达式){
       //代码句子
    }
    

    声明语句:声明新的局部变量,该变量的类型必须和数组元素的类型匹配。其作用域限定在循环语句块,其值与此时数组元素的值相等。

    表达式:表达式是要访问的数组名,或者是返回值为数组的方法。

  • 例子:

    public class Test {
       public static void main(String[] args){
          int [] numbers = {10, 20, 30, 40, 50};
     
          for(int x : numbers ){
             System.out.print( x );
             System.out.print(",");
          }
          System.out.print("\n");
          String [] names ={"James", "Larry", "Tom", "Lacy"};
          for( String name : names ) {
             System.out.print( name );
             System.out.print(",");
          }
       }
    }
    
    /*输出:
    10,20,30,40,50,
    James,Larry,Tom,Lacy,
    */
    

十五、跳转语句

Java 语言中,有三种跳转语句:break、continue 和 return。

(一)break 语句

  • break 主要用在循环语句或者 switch 语句中,用来结束整个循环或者跳出整个语句块。

  • 有多个循环嵌套时,break 跳出其所在循环的最里层的循环

    public class Test {
        public static void main(String[] args) {
    
            for (int i = 1 ;i <4;i++){
                for (int a = 4;a > 0;a--){
                    if(a == 2){
                        break;
                    }
                    System.out.print(a + " ");
                }
            }
        }
    }
    
    /*输出
    4 3 4 3 4 3
    */
    

(二)continue 语句

  • continue 适用于任何循环控制结构中。作用是让程序立刻终止本次循环,直接进行下一次循环的判定

    在 for 循环中,continue 语句使程序立即跳转到操作表达式语句。

    在 while 或者 do…while 循环中,程序立即跳转到布尔表达式的判断语句。

  • 例子:

    public class Test {
       public static void main(String[] args) {
          int [] numbers = {10, 20, 30, 40, 50};
     
          for(int x : numbers ) {
             if( x == 30 ) {
            continue;
             }
             System.out.println( x );
          }
       }
    }
    /*输出:
    10
    20
    40
    50
    */
    

(三)return语句

  • return语句可以从一个方法返回,并把控制权交给调用它的语句。

(四)关于带标签的break和continue(扩展,不推荐使用)

  • Java唯一用到标签的地方是在循环语句之前,而在循环语句之前设置标签的原因:

    当 break 或 continue 语句出现在嵌套循环时,它只能跳出内层循环,如果想使用 break 或 continue 语句跳出外层循环,则需要对外层循环添加标签,它们就会中断到标签的地方。

public class Test {
    public static void main(String[] args) {

        outer:for (int i = 1 ;i <4;i++){
            for (int a = 4;a > 0;a--){
                if(a == 2){
                    break outer;	//结束指定标签的那一层循环
                }
                System.out.print(a + " ");
            }
        }
    }
}

/*输出
4 3
*/
  • 带标签的 break:结束指定标签的那一层循环。
  • 带标签的 continue:结束一次指定标签的那一层循环。
posted @ 2022-02-26 23:47  小钊丶  阅读(197)  评论(0编辑  收藏  举报