控制语句的学习,前一天我们主要学习了Java的“单词”,今天我们来学习语法。编程语言的语法就两类控制语句:选择语句,循环语句。这里面有一个注意的点,在方法体里,程序运行的顺序是从上到下依次执行。
一、选择语句,顾名思义,就是选择关系,如果出现第一种情况,就进行A操作;出现第二种情况,就进行B操作,以此类推。以下有常用的四种选择语句格式(语法):
if(boolean){ /执行语句,用分号隔开 }
if(boolean){ } else{ }
if(boolean){ } else if(boolean){ } else if(boolean){ }.......else { } 项目中比较常用,多条件复杂语句;
switch(){case 1: ;[break];case 2: ;[break];...........;default: ;} 因为case后面是值或者字符串,switch括号里面的内容要和case后面的值比较,所以一般这种语句在后面项目中,和枚举类一起用的比较多。注意里面的break和default是可选,但是一般情况下,我们都会使用到break,这样满足一个条件就会跳出switch语句,否则会一直执行完。
下面根据一道题,可以把这几个语句都练习学习到:
向控制台输入一个数字,这个数字是某人一次考试的成绩,如果这个成绩在0分到60分之间,判定为不及格,超过60分,即判定为及格,超过70分则为中等,超过80分则为良好,超过90分则为优秀,满分是100分。分数有小数。
1、先用if(boolean){} else if(boolean){} else if(boolean){}.......else {} 解题。
代码如下:
import java.util.Scanner;//导入scanner类,因为向控制台输入需要用到
public class TestSwitch {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);//Scanner这个类就是来接收数据,后面对类的讲解中再详细介绍,包括io流中的System,现在就记住
System.out.println("请输入你的分数:");
double score=scanner.nextDouble();//Scanner这个类就是来接收数据,后面对类的讲解中再详细介绍,包括io流中的System,现在就记住
// 接收到输入的信息之后,接下来就是使用if语句进行判断
if(score>0&&score<60) {
System.out.println("不及格");
}else if(score>=60&&score<70) {
System.out.println("及格");
}else if(score>=70&&score<80) {
System.out.println("中等");
}else if(score>=80&&score<90) {
System.out.println("良好");
}else if(score>=90&&score<=100) {
System.out.println("优秀");
}else {
System.out.println("你输入的分数不合法!");
}
}
}
结果如下:
请输入你的分数:
20.9876
不及格
再试一次:
请输入你的分数:
71
中等
再试一次:
请输入你的分数:
110.89
你输入的分数不合法!
2、下面再采用switch语句和if else语句组合再解一次题。
代码如下:
import java.util.Scanner;
public class TestSwitch {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);//Scanner这个类就是来接收数据,后面对类的讲解中再详细介绍,包括io流中的System,现在就记住
System.out.println("请输入你的分数:");
double score=scanner.nextDouble();//Scanner这个类就是来接收数据,后面对类的讲解中再详细介绍,包括io流中的System,现在就记住
// 接收到输入的信息之后,接下来就是使用switch语句进行判断
//先要判断分数是不是在0-100分之内,采用if else语句
if(score<0||score>100){
System.out.println("你输入的分数不合法");
}else {
switch((int)(score/10)) { //这里有个很重要的关键点,是本题采用switch的核心关键点,将分数除以10,再取整数,和case值作比较。
case 9:
System.out.println("优秀");
break;
case 8:
System.out.println("良好");
break;
case 7:
System.out.println("中等");
break;
case 6:
System.out.println("及格");
break;
default:
System.out.println("不及格");
}
}
}
}
只要将上面一道题详细理解,并用这两种方式完成编程,基本就掌握了选择语句的使用。
二、循环语句
循环语句顾名思义就是满足某个条件,就一直执行一段代码块。循环语句有以下几种形式:
while(boolean){ / 执行语句 } 即满足小括号的条件,boolen值为true,就执行大括号里面的代码;
do{ }while(boolean)和while没有本质区别,只不过先执行一次大括号里面的代码,然后判断小括号的条件是否为真,如果为真继续执行;基本很少使用;
for( ; ; ;){ },最常用的循环语句,基本后面的项目中都使用的是这个语句。
下面用一道题看一下while和for语句的基本使用:
计算1+2+3+4+.......+100的和。
重点我们来关注一下for和while代码块的语句执行,做一个对比
while(i<=100){
sum+=i;
i++;
}执行过程是先判断i是不是小于等于100,满足条件,i+sum赋值给sum,然后i自加1,判断i是否满足条件,一直到i>100,结束。
for(int i=0;i<=100;i++) {
sum+=i;
}这里面的执行过程一样,但是记住小括号里面的内容不是一起按顺序执行的,int i=0只执行一次,i++是等到代码块执行完才开始执行的,切记。
那么for循环实在是在后面的项目中太常用到了,比如页面的图片排列,就是一个典型的for循环嵌套,所以我们再给一道题加深一下,这个也是for循环的典型案例,即打印九九乘法表。
代码:
public class TestForFor {
public static void main(String[] args) {
for(int i=1;i<=9;i++) {
for(int j=1;j<=i;j++) {
System.out.print(i+"*"+j+"="+i*j+"\t");//其中“\t”表示等式中间的空格
}
System.out.println();//表示换行
}
}
}
三、方法
除了一些特殊的方法外,方法大部分情况下,都是由局部变量和上面学到的选择语句和循环语句构成的。
1、方法的构成:以之前背过的一句代码主方法为例:
public static void main (String[] args) {
// 修饰符 返回值类型 方法名 形式参数 方法体
//局部变量和控制语句
}
2、方法的使用
当方法返回值类型是void的时候,方法返回被当做一条语句,当方法返回值类型是其他的时候,返回的通常是一个值,这里面就会用到return。其中形参和实参值传递的时候,传递的是值得拷贝,那么引用数据类型传递的是对象地址的拷贝,这个后面会常用。通常方法调用都是这个格式:
[引用名或者类名].方法名();
3、常用方法类型
我们在进行面向对象编程的时候,主要就是使用各种已经写好的方法,以及怎么使用他们,所以具体的例子具体去分析。但是这里面有几类特殊的方法,可以在这里提前总结一下,后面用到的时候我们再回来做一个回顾:
a、成员方法:也叫实例方法,没有修饰符static。
b、静态方法:也叫类方法,有修饰符static。不能被重写。
c、方法重载:一个类的两个方法拥有相同的名字,但是有不同的参数列表。注意,方法的重载一定是在一个类中发生的,方法名字相同,而参数不同(包括了形参类型不同,形参个数不同和形参顺序不同),访问修饰符、返回类型可以相同也可以不同。最常用到的就是构造器(构造方法)的重载,因为我们创建对象的方式可能多种多样。方法的重载是一个类多态的表现。
d、方法重写:重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。类的继承最重要的特征,一般是子类对父类的方法的重写。子类父类多态的表现。一般情况是子类根据自己的特殊需要重新实现父类的方法。注意,方法的重写一定是父类与子类之间的,方法名字和参数列表必须相同,返回类型可以相同也可以不同(必须是子类型,多数情况直接认定为不可修改),访问修饰符子类必须比父类高或者相同。
e、构造方法:创建对象并对对象进行初始化,new 构造方法就是创建对象的语句。构造方法也叫构造器,他的名字和类的名字相同,没有返回值类型(其返回值类型是本类),访问控制修饰符和类的一样,不能再方法体里面使用return返回某个值,可以单独使用return。如果不写,会有一个默认构造方法,是来给类的实例对象赋初值的,因此我们会把赋初值相关的操作都写到构造方法里面。构造方法重载也很重要,比如有一个没有参数的构造器,还需要有参构造器。注意构造方法不能用static修饰。如果同一个类中,构造方法调用构造方法,可以用this直接指代构造方法。
f、getter setter方法:public修饰的get{}和set{}方法,和对象的封装的概念息息相关,主要解决封装问题。是外部类访问私有成员变量的入口。
g、抽象方法:抽象类里面使用的,abstract修饰的方法,不能有方法体,无法被实例化,方法名后面直接跟一个分号,而不是大括号。如果一个类有抽象方法,这个类必定是抽象类。主要和继承概念有关。
h、final修饰的方法:可以被重载,不能被重写
在这个阶段一定要能区分这些方法的含义,因为后面类和对象中调用方法的时候,不同方法调用方式都不一样。比如实例方法和静态方法的对比:
概括来说,就是静态变量和静态方法是随类产生的,都需要通过类来调用,因此可以通过类名.方法名直接调用,在同一个类里面,类名可以省略;成员变量和成员方法,是随对象产生的,需要通过引用来调用,因此可以通过引用名.方法名调用,在同一个类里面,引用名可以用this代替。
再对比方法重写和方法重载的区别:
其他方法的使用在后面的内容中都会讲到,这里要有一个整体的概念。
至此,我们就算是学完了编程的基础,注意是编程的继承,基本任何编程语言都要学习上面的内容。接下来才算是真正进入到Java的领域。不得不说的是,学完上面的内容,基本上所有的程序我们都能写了,但是为了效率,写的效率,运行的效率,实际工作中肯定是不能这么干的。