Notes 20180308 : 语句
Posted Abri
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Notes 20180308 : 语句相关的知识,希望对你有一定的参考价值。
在讲解流程控制语句之前,我们先来说一下语句的问题。Java中的语句分为声明和赋值语句,条件和循环语句,调用和返回语句;我们之所以每两个放在一起是有深意的,我们大致将语句分为这三块,并以此为纲来说一下,重点在流程控制语句(条件和循环语句)。
程序就是由一系列的声明、赋值、条件、循环、调用和返回语句组成的。一般来说代码的结果都是嵌套的:一个条件或循环语句中也可以嵌套条件语句或循环语句。而一个函数中可以由若干各种语句组成,若干的函数组成类,正式这样的组合才形成了功能丰富的软件。下面我们从声明和赋值语句讲起;
1.1 声明与赋值语句
声明语句将一个变量名和一个类型在编译时关联起来。Java需要我们在声明语句的时候指定变量的名称和类型。这样我们才能清楚的明白能够对其进行的操作。Java是一种强类型语言,因为Java编译器会检查类型的一致性(例如,它不会允许boolean类型和浮点类型的变量相乘)。变量可以声明在第一次使用之前的任何地方,一般我们会在首次使用时声明它,变量的作用域就是定义它的地方(成员或局部),一般由相同代码段中声明之后的所有语句组成。
赋值语句(由一个表达式定义的)将某个数据类型的值(可以是具体值,也可以是一个引用)和一个变量关联起来。在Java中,我们进行赋值操作,我们表达的不是数学中的等于“=”,而是将一个地址与该变量名绑定,让该变量名指向这个内存地址。
package cn.assignment; public class Test { //声明语句由数据类型与变量名称构成,--这里的数据类型可以是基本数据类型,也可以是引用类型--对象 static int i; /*int ii; ii = 89;*///不允许在赋值语句声明完后再赋值,要在一起操作,但是可以成员声明,函数中进行赋值的操作 static int a1; public static void main(String[] args) { i = 23; System.out.println(i);//23 System.out.println(a1 = 90);//90 } }
我们在开发中往往建议将声明和赋值放在一起操作,即声明的同时给语句赋值。
1.2 调用和返回语句
我们对Java最大的印象只怕就在面向对象了,我们写的所有类的最大作用就是在于为有需要的类提供可供解决的方法。这就是调用的的思想。例如我们写一个加法的运算,那么以后凡是遇到加法的运算,那么就都可以通过调用这个方法来解决了,这就是调用的思想,而有些方法是具有返回值的,返回值的语句是返回语句;举例如下:
//简单的加法运算 public static int add(int a,int b){ return a+b;//返回语句 }
通过上面我们发现语句并不固定于单类型语句的使用,而是花样百出的嵌套,组合使用,这也是高级编程语言的灵活所在。在返回语句中我们发现有一个关键字return,这里我们不多做介绍,我们放在流程语句和continue和break一起介绍。
1.3 流程控制语句
了解完声明和赋值语句、调用和返回语句,那么我们就进入今天的重头戏--流程控制语句了,我们在本节中会叙述流程控制语句的功能,同时还会附以案例加强,最后会深入探讨流程控制语句。
做任何事情都要遵循一定的原则。例如,到图书馆去借书,就必须有借书证,并且借书证不能过期,这两个条件缺一不可。程序设计也是如此,需要有流程控制语言来实现与用户的交流,并根据用户的输入决定程序要“做什么”、“怎么做”等。
流程控制语言对于任何一门编程语言来说都是至关重要的,它提供了控制程序步骤的基本手段。如果没有流程控制语句,整个程序将按照线性的顺序来执行,不能根据用户的输入来决定执行的序列。我们大略的将流程控制语句分为以下这么几类,复合语句、条件语句、循环语句。需要说明的一点是Java的控制流程结构与C、C++的控制流程结构一样,只有很少的例外情况。没有goto语句,但是通过break+标签,可以实现从内层跳出的目的,另外,JDK1.5提供了一种变形的for循环,这是在C、C++中没有出现过的。类似于C#中的foreach循环。
1.3.1 复合语句
与C语言及其它语言相同,Java语言的复合语句是以整个区块为单位的语句,所以又称块(block)语句。块是指由一堆大括号括起来的若干条简单的Java语句。块语句以整个块为单位,可以用在任何一个单独语句可以用到的地方,块确定了变量的作用域。一个块可以嵌套在另一个块中。在前面的学习中已经解触到了这种块语句。例如在定义一个类或方法时,类体就是以“{}”作为开始与结束的标记,方法体同样也是以“{}”作为标记。对于块语句中的每个语句都是从上到下的执行。
在使用复合语句时特别要注意,复合语句为局部变量创建一个作用域,该作用域为程序的一部分,在该作用域中某个变量被创建并能够被使用,如果某个变量的作用域外使用该变量,则会发生错误。同时,不能在嵌套的两个块中声明同名的变量,这也是不被允许的。
【例5.1】创建CompoundStatementPractice类,进行复合语句的一些验证;
class CompoundStatementPractice{ public static void main(String[] args){ int a = 23 ; System.out.println("a的值是:"+a); { int b = 24 , c = 25 ; System.out.println("b的值是:"+b); boolean boo ; //我们一定要注意变量的作用域,也就是它的生命周期 { boo = b > c ; System.out.println("复合语句中的嵌套语句:"+boo); } // int a = 20 ; 如果在main方法中已经声明成员变量,复合语句中再次声明相同名字的成员变量会出现错误 a = a++ + 1 ; } //System.out.println("在变量的作用域外使用变量会出现错误:"+b); 会提示找不到符号 System.out.println("我们一定要注意变量的作用域,和语句的线性顺序:"+a); } }
1.3.2 条件语句
条件语句可根据不同的条件执行不同的语句。条件语句包括if条件语句和switch多分支语句。
1.3.2.1 if条件语句
If条件语句是一个重要的编程语句,它用于告诉程序在某个条件成立的情况下执行某段程序,而在另一种情况下执行另外的语句。
使用if条件语句,可选择是否要执行紧跟在条件之后的那个语句。关键字if之后是作为条件的“布尔表达式”,如果该表达式返回的结果是true,则执行其后的语句;若为false,则不执行if条件之后的语句。If条件语句可分为简单的if条件语句、if...else语句和if...else if多分支语句。if语句在开发过程中可能会出现Dead Code情况,我们平时可能较少遇到,但是要知道这种情况,并且明白这是编译器多做的优化.
1.3.2.1.1 简单的if语句
语法格式如下:
if(布尔表达式){ 语句序列 }
- 布尔表达式:必要参数,表示它最后返回的结果必须是一个布尔值。它可以是一个单纯的布尔变量或常量,或者使用关系或布尔运算符的表达式。
- 语句序列:可选参数。可以是一条或多条语句,当表达式为true时执行这些语句。如果语句序列中仅含有一条语句,则可以省略条件表达语句中的大括号。如果我们自己编程时书写了大括号,同时语句序列中只有一条语句,那么编译器在编译时会自动帮我们去除大括号。
【例5.2】创建IfPractice类,进行简单if条件语句的练习
class IfPractice{ public static void main(String[] args){ int a = 23 , b = 24 ; boolean boo = true ,aoo = false ; if(! false == boo || (5 == 6)){ System.out.println("表达式的形式可以多样但其结果必须为boolean类型"); } if(5 == 6);{ System.out.println("如果if条件语句后即()后直接跟;则该条if简单语句语句无论是否成立都继续下面代码"); } if(a < b){ if( a < b){ System.out.println("If语句可以像复合语句一样嵌套语句!"); } System.out.println("简单if语句的标准形态;"); } if(aoo) System.out.println("简单if语句序列中若只有一条语句则可以省略{}这时并无语法错误,并且if语句的作用范围也可覆盖,但不支持,为了增强阅读性"); System.out.println("if语句若省略{},那么其作用范围只是紧随其后的一条语句,其他的语句会线性执行,不会受其表达式的影响!"); if(boo){}//当简单if语句序列中没有内容时可以省略{},末尾加;,当然也可以保留, if(a < b && boo){ System.out.println("简单if语句中的条件一定要是布尔表达式,也就是结果必须是布尔型,格式不限制"); } /*if(3 = 3){ System.out.println("我们一定要确定if语句条件表达式的数据类型,如上3是int型,结果也是int型,会爆出错误以外的类型"); }*/ } }
If语句注意点: a,每一种格式都是单条语句。 b,第二种格式与三元运算符的区别:三元运算符运算完要有值出现。好处是:可以写在其他表达式中。 c,条件表达式无论写成什么样子,只看最终的结构是否是true 或者 false; D.if语句同复合语句一样可以嵌套语句 |
If语句流程运行图:
|
1.3.2.1.2 if...else语句
If....else语句和三元运算符的区别 |
If ....else语句的执行行程图 |
对于if...else语句可以使用三元运算符对语句进行简化,如下面的代码 if(a > 0) b = a ; else b = -a; 可以简化成: b = a>0?a:-a ;上面代码为求绝对值的语句,如果a > 0,就把a的值赋给b,否则将-a赋值给b。也就是“?”前面的表达式为真,则将问号和冒号之间的表达式的计算结果赋值给变量b,否则将冒号后面的计算结果赋值给b,使用三元运算符的好处是可以使代码简洁,并且有一个返回值。 |
图3.4 if...else语句的执行过程图 |
在第一种简单if语句中条件不成立时if语句不能给出任何反馈,这是出现了第二种if语句当条件表达式的结果为true则执行语句1,否则执行语句2.
注意事项:
A.else没有条件表达式
B.else必须和if组合使用,else不能单独使用会报错
C.一个if语句只能有一个else
else是可以省略的,当知道条件表达式成立时,可以省略else,这时就相当于1.1if语句
if语句和else联合使用时,if如果控制多行语句就一定要加{},否则出现B错误,这时情况为if语句+输出语句+else,B情况产生,如果if控制一行else控制一行时大括号能省,这时如果条件表达式为true则进行紧挨if语句的输出,反之输出else,当if控制一行else控制多行时如果条件表达式为true则进行紧挨if语句的输出,else中输出除去紧挨else的语句 反之else中输出,所以Java中不管什么情况不要省略{},避免错误
【例5.3】创建IfElsePractice类,并针对if....else的一些特性进行验证
class IfElsePractice{ public static void main(String[] args){ /*else{ System.out.println("else必须和if语句连用,不能单独使用,否则会错误,有\'if\',但是没有\'else\'"); }*/ if(5 > 6){ System.out.println("我们可以看到简单if语句条件不成立时,if语句不能出现任何反馈,那么我们怎么知道是条件不成立还是程序错误呢,这时就出现了if...else语句"); } if(5 > 6){ System.out.println("为补充if语句而出现的if...else语句"); }else/*(5 < 6)*/{ System.out.println("if...else语句中else语句后不能有条件语句直接跟随{},如果跟随(),会发出错误,提示在()后加;"); }/*else{ System.out.println("一个if语句只能和一个else语句连用,否则会错误,有\'if\',但是没有\'else\'"); }*/ if(5 < 6){ System.out.println("当if后面只控制一条语句时,可以省略{},它会直接输出,否则不支持,因为它只会输出紧跟他的一条"); }else{ System.out.println("当else后面只控制一条语句时,可以省略{},它会直接输出,否则不支持,因为它只会输出紧跟他的一条"); } /*if(5 > 6) System.out.println("{}省略"); 当if...else...语句中,if后边控制多条语句时,{}不可 以省略,否则会报错“有if没有else” System.out.println("{}省略"); else{ System.out.println("{}省略时,"); }*/ //嵌套语句在if...else语句中的应用 if(true){ if(false){ System.out.println("嵌套语句在if...else中的使用"); }else{ System.out.println("嵌套语句在if...else中的使用"); } }else{ System.out.println("嵌套语句在if...else中的使用"); } /*三元运算符和if...else语句的区别, If--else语句与三元运算符的区别:三元运算符运算完要有值出现。好处是:可以写在其他表达式中,而if----else语句则没有这种限制,但是可以写在其他方法中,不能写在表达式中*/ //求 a的绝对值和b的和 int a = 7 , b = 3 , sum ; if(a > 0){ System.out.println("您所求的两个数的和为:"+(a+b)); }else System.out.println("您所求的数的绝对值为:"+(-a+b)); sum = (a > 0 ? a : (-a))+b; System.out.println("您所求的两个数的和为:"+sum); } }
面试题:问下面一段代码是否会正常输出?
if(5 > 6) System.out.println("{}省略”); System.out.println("{}省略"); else{ System.out.println("{}省略时,"); }
答:不会,代码会出现错误,当代码判断条件语句不成立时,会自动跳过紧跟他的一条语句,这是它的作用范围,然后编译下一条代码,这时因为没有发现else,会将他认为是简单if语句,再往下执行时发现了else语句,这是编译会将其作为不合法代码跳出”错误:有’if’没有’else’”
1.3.2.1.3 if...else if语句
注意事项:
- A.else if必须和if组合使用,else if语句末尾可以(意味着非必须)是一条单独的else语句
- B.else不能有条件表达式
- C.我们if语句第三种格式,任何一个条件表达式成立,if语句直接结束.
【例5.4】创建IfElseIfPractice类,进行对IfElseIf语句的特性进行一些验证
class IfElseIfPractice{ public static void main(String[] args){ if(false){ System.out.println("1"); }else if(false){ System.out.println("2"); }else if(true){//当发现if条件语句为true时,只执行这条语句,其他的就不再执行, System.out.println("3");//跳出这个if..else..if语句,执行其他程序 }else if(true){ System.out.println("4"); }else{ System.out.println("5"); } } }
1.3.2.1.4 if条件语句练习
【例5.5】学生考试成绩出来了请对其进行划分等级,要求90--100 A等 80--89 B等 70--79 C等 60--69 D等 60分以下 叫家长,谈人生
分析:我们初看到这道题目时,要注意这么几点
- 考试成绩大于等于0小于等于100,所以我们要考虑输入错误的情况!
- 由于成绩是一个变量,所以这里我们需要一个变量来代表这个成绩
- 等级对于成绩来说是一个区间,并且这是一个条件语句,所以我们需要应用到比较运算符,和逻辑运算符。
- 由于我们在这里需要比较很多区间,所以我们需要考虑用哪种语句,在这里很明显选择第三种if语句
class GradePractice{ public static void main(String[] args){ int score = 178 ; if(score <= 100 && score >= 90){ System.out.println("您的成绩是:"+score+",相对应的成绩等级为:A等"); }else if(score < 90 && score >= 80){ System.out.println("您的成绩是:"+score+",相对应的成绩等级为:B等"); }else if(score < 80 && score >= 70){ System.out.println("您的成绩是:"+score+",相对应的成绩等级为:C等"); }else if(score < 70 && score >= 60){ System.out.println("您的成绩是:"+score+",相对应的成绩等级为:D等"); }else if(score >=0 && score < 60){ System.out.println("您的成绩是:"+score+",叫家长,谈人生!"); }else{ System.out.println("成绩输入错误请检查后重新输入!"); } } }
【例5.6】给出月份,判断它所处的季节 3-5 春季 6-8 夏季 9-11 秋季 12-2 冬季
分析:我们首先来看需求
- 首先我们需要定义一个变量来代表月份,我们用这个变量来在区间中比较;
- 第二这个变量要符合我们的要求,即大于等于1,小于等于12,所以我们要考虑输入错误的情况;
- 第三我们要选择合适的语句,在这里我们有很多种方法,下面一一介绍
方法一:一个个比较,使用简单if语句。
class SeasonPractice1{ public static void main(String[] args){ int month = 9 ; //声明一个代表月份的变量 if( month == 1){ System.out.println("这个月份属于冬季!"); } ...... if( month == 3){ System.out.println("这个月份属于春季!"); } ...... if( month == 6){ System.out.println("这个月份属于夏季!"); } ...... if( month == 9){ System.out.println("这个月份属于秋季!"); } ...... if( month == 12){ System.out.println("这个月份属于冬季!"); }else{ System.out.println("您输入的数据储存在问题,请检查后重新输入!"); } } }
方法2:使用逻辑运算符加上if语句。
class SeasonPractice2{ public static void main(String[] args){ int month = 2 ; if(month == 12 || month == 1 || month == 2){ System.out.println("这个月份属于冬季!"); //我们在这里使用if...else.if语句,需要明白语句的一个特性当有else.if语句为真时即跳出语句不再进行if.else语句,进行其他语句 }else if(month == 3 || month == 4 || month == 5){ System.out.println("这个月份属于冬季!"); }else if(month == 6 || month == 7 || month == 8){ System.out.println("这个月份属于冬季!"); }else if(month == 9 || month == 10 || month == 11){ System.out.println("这个月份属于冬季!"); }else { System.out.println("对不起,您输入的数据存在问题,请检查后重新输入!"); } } }
方法三:使用比较运算符,逻辑运算符和if语句;
class SeasonPractice3{ public static void main(String[] args){ int month = 17 ; if(month == 1 || month == 2 || month == 12){ System.out.println("这个月份属于冬季!"); }else if(month >= 3 && month <= 5){ System.out.println("这个月份属于春季!"); }else if(month >= 6 && month <= 8){ System.out.println("这个月份属于夏季!"); }else if(month >= 9 && month <= 11){ System.out.println("这个月份属于秋季!"); }else{ System.out.print("对不起,您输入的数据错误,请检查后重新输入!"); } } }
方法四:精简代码,从上面的三种方法我们可以看出代码的相同性有这么几点,(变量的判断比较,结果的输出,逻辑运算符的运用),我们将这相同的几点进行精简如下!
class SeasonLastPractice{ public static void main(String[] args){ int month = 7 ; String str ; if(month == 1 || month == 2 || month == 12){ str = "这个月份属于冬季!"; }else if(month >= 3 && month <= 5){ str = "这个月份属于春季!"; }else if(month >= 6 && month <= 8){ str = "这个月份属于夏季!"; }else if(month >= 9 && month <= 11){ str = "这个月份属于秋季!"; }else{ str = "对不起,您输入的数据错误,请检查后重新输入!"; } System.out.print(str); } }
【例5.7】比较三个数的大小(if语句的嵌套使用)
package cn.if_else; public class ComparePractice { public static void main(String[] args) { test(7, 7, 7); test(1, 2, 3); test(2, 1, 3); test(3, 2, 1); test(1, 3, 2); } public static void test(int a,int b,int c){ if(a>=b){ if(b>=c) System.out.println("这三个数的大小为:"+"a>=b>=c"); else if (a>=c) { System.out.println("这三个数的大小为:"+"a>=c>b"); }else { System.out.println("这三个数的大小为:"+"c>a>=b"); } }else { if(b<=c) System.out.println("这三个数的大小为:"+"a<b<=c"); else if(a<=c){ System.out.println("这三个数的大小为:"+"a<=c<b"); }else { System.out.println("z这三个数的大小为:"+"c<a<b"); } } } }
【例5.8】求三个数中的最值;(这里本人做出了一种测试,实际可以有多重方法,不一一赘述,详细的可以参见CSDN的一篇文章,代码赘述在下面)
package cn.if_else; public class MaxPractice { public static void main(String[] args){ max(7, 6, 9); min(7, 6, 9); } public void test(){ int a = 2 , b = 8 , c = 6 , max = 0; //如果只是求最大值,那么我们只用拿出大的那个值同最后一个值比较 if(a > b){ if(a > c){ max = a ; }else{ max = c ; } }else{ if(b > c){ max = b ; }else{ max = c ; } } System.out.print("三个数的最大值为:"+max); } /** * 求最大值 */ public static void max(int a,int b,int c){ if(a>=b&&a>=c) System.out.println("最大值为:"+"a"); else if (c>=b&&c>=a) { System.out.println("最大值为:"+"c"); }else if(b>=a&&b>=c) { System.out.println("最大值为:"+"b"); } } /** * 求最小值 */ public static void min(int a,int b,int c){ if(a<=b&&a<=c){ System.out.println("最小值为:"+"a"); }else if (b<=a&&b<=c) { System.out.println("最小值为:"+"b"); }else if (c<=a&&c<=b) { System.out.println("最小值为:"+"c"); } } }
1、if语句嵌套 int a = 10; int b = 30; int c = 20; int max; if (a > b) { if (a > c) { max = a; } else { max = c; } } else { if (b > c) { max = b; } else { max = c; } } 2、if语句 int a = 10; int b = 30; int c = 20; int max; if (a > b) { max = a; } else { max = b; } if (max < c) { max = c; } 3、if语句(假定a最大,b,c与a比较,如果比a大,则赋值给max) int a = 10; int b = 30; int c = 20; int max = a; if (b > max) { max = b; } if (c > max) { max = c; } 4、三元运算符 int a = 10; int b = 30; int c = 20; int max = (a > b) ? a : b; max = (max > c) ? max : c; 或者 int max = ((a > b ? a : b) > c) ? (a > b ? a : b) : c;(建议不用这种) 5、if语句 + 逻辑运算符 &&(a,b,c三个数,如果不是a最大,或者b最大,就是c最大) int a = 10; int b = 30; int c = 20; int max; if (a > b && a > c) { max = a; } else if (c > a && c > b) { max = c; } else max = b;
1.3.3 选择语句
在JDK 1.6及以前的版本中,switch语句中表达式的值必须是整型或字符型,常量值1~n必须也是整型或字符型,但是在JDK 1.7中,switch语句的表达式的值除了整型和字符型,还可以是字符串类型,这是JDK1.7 新添的特性。
switch语句:
- A.当我们看到switch的时候,这就是一个选择语句
- B.表达式:是一个常量或者变量,byte,short,int,char,所以case取值其实与表达式的类型一致
- jdk1.5以后支持枚举, jdk1.7以后支持String
- C.case:表示的就是一个选项,取值就是选项的值
- D.执行语句:功能代码.
- E.break:switch语句的结束符.
- F.default:默认值,相当于if语句的else
【例5.9】根据指定的日期(1~7),输出相应的星期;
class SwitchWeekPractice{ public static void main(String[] args){ int day = 9 ; switch(day){ default: //若没有一个常量的值与表达式的值相同则默认执行default, System.out.println("请检验您的输入数字是否正确!"); //如果没有发现break,则继续执行下面的case语句直到发现break case 1: System.out.println("根据您输入的数字可以确定是:星期一"); break; 20180308错题解析[AndroidStudio]_[初级]_[配置自动完成的代码片段]
[AndroidStudio]_[初级]_[配置自动完成的代码片段]