1.Java介绍
1.1Java的起源与演变
1.1.1Java起源
20世纪90年代,单片式计算机系统诞生,单片式计算机系统不仅廉价,而且功能强大,使用它可以大幅度提升消费性电子产品的智能化程度
SUN公司为了抢占市场先机,在1991年成立了一个由詹姆斯·高斯林(James Gosling)领导,名为“Green”项目小组,目的是开发一种能够在各种消费性电子产品上运行的程序架构
那么使用何种编程语言来设计,是项目小组头疼的事。当时C++较为有优势的,项目小组首先考虑的是采用它来编写程序,但C++过于复杂和庞大,再加上由于消费电子产品所采用的嵌入式处理器芯片的种类繁杂,需要让编写的程序跨平台运行,假如用C++编写的话对程序的跨平台运行不友好
最后项目小组决定:既不用C++编写,也不开发全新的编程语言,而是对C++进行改造:去除了C++复杂的指针和内存管理,并结合嵌入式系统的实时性要求,最终在1992年,他们开发了一种名为“Oak”的面向对象语言
当他们在向硬件生产商进行演示的时候,硬件生产商对此并不感冒,OaK语言因为缺乏硬件的支持而无法进入市场,从而被搁置一旁
1994年,项目小组看到了浏览器在未来的发展前景,于是决定将OaK应用于万维网。1995年,他们用OaK语言研发了一种能将小程序嵌入到网页中执行的技术——Applet,由于Applet不仅能嵌入网页,还可随同网页在网络上进行传输,这让无数的程序员看到了OaK这门语言,与此同时,OaK正式更名为Java。从此,Java在互联网的推动下火了
1.1.2Java演变
-
1991年 Green项目,开发语言最初命名为Oak (橡树)
-
1994年,开发组意识到Oak 非常适合于互联网
-
1996年,发布JDK1.0,约8.3万个网页应用Java技术来制作
-
1997年,发布JDK 1.1,JavaOne会议召开,创当时全球同类会议规模之最
-
1998年,发布JDK 1.2,同年发布企业平台J2EE
-
1999年,Java分成J2SE、J2EE和J2ME,JSP/Servlet技术诞生
-
2004年,发布里程碑式版本:JDK1.5,为突出此版本的重要性,更名为JDK 5.0
-
2005年,J2SE -> JavaSE,J2EE -> JavaEE,J2ME -> JavaME
-
2009年,Oracle公司收购SUN,交易价格74亿美元
-
2011年,发布JDK 7.0
-
2014年,发布JDK 8.0,是继JDK 5.0以来变化最大的版本
-
2017年,发布JDK 9.0,最大限度实现模块化
-
2018年3月,发布JDK 10.0,版本号也称为18.3
-
2018年9月,发布JDK 11.0,版本号也称为18.9
1.2Java体系与特点
1.2.1Java体系
Java SE: Java Platform,Standard Edition
标准版: 各应用平台的基础,桌面开发和低端商务应用的解决方案
Java EE: Java Platform,Enterprise Edition
企业版: 以企业为环境而开发应用程序的解决方案
Java ME : Java Platform, Micro Edition
微型版: 致力于消费产品 和嵌入式设备的最佳解决方案
1.2.2Java的特性
一种纯面向对象的编程语言
一种与平台无关(跨平台)的语言。(它提供了在不同平台下运行的解释环境)
一种健壮的语言,吸收了C/C++语言的优点
有较高的安全性(自动回收垃圾,强制类型检查,取消指针)
1.3Java跨平台原理
1.3.1java技术的两种核心机制
Java虚拟机(Java Virtual Machine) JVM
垃圾回收器(Garbage Collection) GC
1.3.2 Java虚拟机 (JVM)
JVM可以理解成一个可运行Java字节码的虚拟计算机系统
-
它有一个解释器组件,可以实现Java字节码和计算机操作系统之间的通信
-
对于不同的运行平台,有不同 的JVM
JVM屏蔽了底层运行平台的差别,实现了“一次编译,随处运行”
1.3.3 垃圾回收器(GC)
不再使用的内存空间应当进行回收-垃圾回收
在C/C++等语言中,由程序员负责回收无用内存
Java语言消除了程序员回收无用内存空间的责任
JVM提供了一个系统线程 , 用于跟踪存储空间的分配情况 , 检查并释放那些可以被释放的存储空间
垃圾回收器在Java程序运行过程中自动启用,程序员无法精确控制和干预
1.3.4JDK、JRE、JVM
-
JDK:Java开发工具包
JDK是提供给Java开发人员使用的,其中包含了java的开发工具,也包括了JRE,所以安装了JDK,就不用在单独安装JRE了。其中的开发工具包括:编译工具(javac.exe) 打包工具(jar.exe)等 -
JRE:Java运行时环境
包括Java虚拟机(JVM Java Virtual Machine)和Java程序所需的核心类库等,如果想要运行一个开发好的Java程序,计算机中只需要安装JRE即可 -
JVM:Java虚拟机
三者的关系如下
1.3.5 JDK版本选择
一般企业开发推荐JDK8和JDK11,Java的未来版本属于JDK17
2.环境搭建
2.1常用DOS命令
- dir : 列出当前目录下的文件以及文件夹
- cls: 清除屏幕
- md : 创建目录
- rd : 删除目录
- cd : 进入指定目录
- cd… : 退回到上一级目录
- cd: 退回到根目录
- del : 删除文件
- exit : 退出 dos 命令行
- echo: 打印内容
注:常用快捷键
- tab:自动补全
- ← →:移动光标
- ↑ ↓:调阅历史操作命令
- Delete和Backspace:删除字符
2.2 Java安装
2.2.1安装JDK
推荐JDK8以及以上的版本,更推荐选择JDK8或JDK11的版本
2.2.2配置环境变量
在此电脑-属性-高级系统设置-环境变量中进行配置
红线部分为jdk的安装根目录
红线部分为命令的寻址目录
3.Java程序开发步骤
- 将Java代码编写到扩展名为.java的文件中
- 使用javac命令对该java文件进行编译
- 使用java命令对生成的class文件进行运行
注: 编写的源代码/程序的文件的后缀.java
4.Java的命名规范
命名规范参考Java开发手册(嵩山版)
Java对包、类、方法、参数和变量等要素命名时使用的字符序列称为标识符
命名规范: 软性建议
标识符命名习惯:见名知意
类名规范: 首字母大写,后面每个单词首字母大写(大驼峰式)
方法名规范: 首字母小写,后面每个单词首字母大写(小驼峰式)
变量名规范: 首字母小写,后面每个单词首字母大写。
包名规范:全都小写
5.Java转义符号
实战案例:
\n
\r
\t
\
\ ’
\ "
注:在字符串中加上\符号,那么字符串中的转义字符将不被处理,如下
运行结果如下
6.Java注释
Java程序有三种注释方式
6.1单行注释
格式: // 开头,行末结束
// 用于对单行代码的说明
6.2多行注释
格式: / * 开头,* / 结束
中间行的*号不是必须,只是为了格式整齐
6.3文档注释
格式: 以 /** 开始,以 */ 结束
文档注释负责描述类、接口、方法、构造器、成员属性,可以被JDK提供的工具 javadoc 所解析,自动生成一套以网页文件形式体现该程序说明文档的注释
注: 文档注释必须写在类、接口、方法、构造器、成员字段前面,写在其他位置无效
7.Java的关键字
8.Java的变量
在java中未知数叫变量,未知数可能是整数,也可能是小数,java是强类型语言,要求未知数前面一定要有具体的类型(整数、小数等),因为,这些未知数也是占内存的
8.1变量的声明
- 必须包含 类型、变量名
- 变量没有声明 ,不能直接使用
如下,没有声明变量y就使用,会报错
- 不能重复声明(定义)变量
如下,重复声明了一个变量,报错提示显示:duplicate local variable w,即本地变量w重复
8.2变量的初始化
8.2.1先声明,后初始化
8.2.2声明变量的同时直接初始化
注:
1.没初始化的变量不能被使用(打印)
如下,声明了一个整型变量myMath,但是没有初始化,报错提示没初始化
初始化变量myMath后,没有报错
2.如下,先声明并初始化一个整型变量b,而后再赋值,变量b的值是后来再赋的值
8.3变量的访问
从内存中取出变量,就算访问
注: 先声明并初始化变量后才能访问(使用)变量
8.4不同类型不能直接赋值
给整型变量b赋值为小数,报错提示类型不匹配
如下,声明了一个整型变量,赋值为小数,报错
赋值改为整数,没有报错
9.进制
- 八进制:以0开头
- 十六进制:以0x或0X开头
- 二进制:以0b或0B开头
实战案例
运行结果如下
9.1二进制
计算机中的数据都以二进制数字保存
二进制:逢二进一,即只有0、1两个值
如:十进制的10在计算机内保存为二进制的1010
计算机中信息的存储单位
位(Bit): 表示一个二进制数码0或1,是计算机存储处理信息的最基本的单位
字节(Byte): 一个字节由8个位组成,第一位是符号位,0表示正,1表示负,它表示作为一个完整处理单位的8个二进制数码
字: 32位计算机:1字=32位=4字节;64位计算机:1字=64位=8字节
补充:二进制转十进制
8421法, 若是多位二进制数字,则依据2的次方依次向上叠加,二进制数字中有0则不进行计算,有1则找1对应的数字进行相加即可
9.2十六进制
二进制表示法太冗长,所以在程序中一般喜欢用十六进制
十六进制:基数为十六,逢十六进一。它用abcdef表示从0-9之上的值
Java中十六进制数据要以0x或0X开头,如:0x23D
十六进制转换成二进制只需将每个十六进制数字替换为相对应的四个二进制位即可
9.3八进制
八进制:基数为八
Java中八进制数据要以0开头。如:0123
八进制转换成二进制:只需将每个八进制数字替换为相对应的三个二进制位即可
现在的计算机系统很少用八进制的了
10.数据类型
10.1基本数据类型
java的基本数据类型共8种,如下
10.1.1整型
1.整数数字默认是int类型(即直接量是int),若要声明long类型的,需要在变量的值后面添加L后缀(不区分大小写),也可以省略(省略的时候暗含类型转换)
如下图,声明并初始化了一个变量b,不加l后缀出现报错,报错提示变量的值超出范围
添加L后缀后,报错取消
2.整数做除法,结果还是整数,并且不能四舍五入
3.0不能作为除数,否则运行时会报错
4.存的数过大,可能溢出,也可能报错,例子如下
报错
Integer.MAX_VALUE是整数类型中int的最大值,为2147483647
编译时报错,报错提示显示int类型的值超出范围,因为整数默认是int类型,但是int类型最大值为2147483647,这里超出了,所以报错
在long类型变量后面加上L后缀,报错取消
溢出
编译和运行都不报错,因为存的数过大,溢出了
运行后结果
5.初始化int类型的变量时也可以如下这样写
int x = 1,y = 2,z = 3;
10.1.2浮点型
1.有小数点的数字默认是double类型(即直接量是double),如果要声明一个float类型的变量,需要在变量值的后面添加f后缀(不区分大小写)
如下图,声明并初始化一个变量f2,不加后缀f出现报错,报错提示类型不匹配
添加后缀f后,报错取消
2.double类型可以使用科学计数法来赋值
例如,3.14e2、3.14E2表示3.14 * 10的2次方
结果为
3.浮点数是可以存整数的,因为浮点型比整型存储空间大
4.浮点数做除法,结果是浮点数
5.double声明并初始化一个0.开头的小数时,可以将0省略
如下,运行结果还是0.3
6.浮点数会丢失精度
10.1.3字符型
1.语法格式:char a = 'x';
字符型的值必须使用单引号引起来,且只能存一个字符
如下,存两个字符,报错,报错提示Invalid character constant,即无效的字符常量
2.char其实是一个无符号整数,这个整数和字符进行对应,如下
- 97:a
- 65:A
- 48:0
3.字符集
ascii码:处理英文字母等少量的字符
iso8859-1:不处理中文
gbk、gb2312…:支持中文
unicode字符集:
存储的方式:utf-8 utf-16
注:乱码,就是因为字符集不一致
比如说数字121,在新华字典中代表“中”,在英汉字典中代表“我”,此时就会造成乱码
4.char的赋值方式如下
-
char a = ‘中’;
-
char b = 97;
-
char c = ‘\u535A’;
\u表示unicode值
5.如下图,在控制台打印并不是ab,因为char的底层是整数,a对应97,b对应98,两个变量相加就是两数相加
若想在控制台打印ab,可以使用字符串拼接的方式
10.1.4布尔型
1.boolean类型就两个值
- true
- false
2.结果是布尔的都是布尔表达式,true和false也是布尔表达式
3.实战案例
10.2基本数据类型转换
数据类型按容量大小排序如下
10.2.1强制类型转换
当一个存储空间大的类型转到存储空间小的类型时,正常是不让转的,但是java提供了一个强制类型转换的方式,格式如下
- (要转成的类型)变量名
强制转换,可能数据会不正确
10.2.2自动类型转换
容量小的数据类型会自动转换为容量大的数据类型
10.2.3补充
-
有多种类型的数据混合运算时,系统首先自动将所有数据转换成容量最大的那种数据类型,然后再进行计算
-
byte,short,char之间不会相互转换,他们三者在计算时会先转换为int类型
如下图,计算两个byte类型相加并把结果赋给一个byte类型的值时报错,报错提示类型不匹配
强制转换类型后,报错取消
也可以不给运算结果赋值,直接在控制台打印,此时运算后的结果默认是int类型
-
boolean类型不能与其它数据类型运算
-
当把任何基本数据类型的值和字符串(String)进行连接运算时(+),基本数据类型的值将自动转化为字符串(String)类型,也就是说当+号用在字符串和其他变量中间,就变成了拼接操作
实战案例
1.练习1
2.练习2,如下图,此时在控制台输出123,因为字符串和任何数据类型拼接都会变成字符串,首先,字符串1和整型2拼接后变为字符串12,字符串12又和整型3进行拼接,变为字符串123
3.练习3
4.练习4
11.运算符
操作符优先级
表达式的运算按照运算符的优先顺序从高到低进行,同级运算符从左到右进行
运算符的优先次序
11.1算术运算符
11.1.1自增
注:特殊
1.如下图这样赋值时(红线处),若++在后面,则先赋值再自增;若++在前面,则先自增再赋值
2.如下图,若直接打印i++,则i为10,在Java中,通过直接使用System.out.println(i++);
的语句进行打印时,结果会先打印i的当前值,然后再对i进行自增操作
请注意,打印的结果取决于该语句的执行时机和上下文,假设i是一个初始值为0的整数变量,并且该语句被执行一次,打印的结果将是0,而不是1,这是因为i++是一个后缀自增操作符,在表达式中使用时,它会先返回i的当前值,然后再对i进行自增操作,因此,在打印时,在自增之前,i的值仍然为0
如果对表达式中++i进行打印,它将返回自增后的值,例如,System.out.println(++i);
在执行后打印的结果将是1,因为++i是一个前缀自增操作符,它会先对i进行自增操作,然后再返回自增后的值进行打印
综上所述,直接打印i++的结果将是操作之前的值,而打印++i的结果将是操作之后的值
3.若把自增自减作为判断条件,则变量的值也会改变
运行结果如下
11.1.2自减
注:特殊
如下图这样赋值时(红线处),若–在后面,则先赋值再自减;若–在前面,则先自减再赋值
注:
1.自增和自减都是这样,若++在前,先做自增再做别的运算;若++在后,先做别的运算再自增
11.1.3实战案例
最后进行赋值操作
11.1.4取余
11.2关系运算符
在Java中,“==” 是一个用于比较两个值是否相等的运算符,它可以用于比较数值、字符、布尔值以及对象引用的相等性, 当被比较的两个值相等时,表达式返回 true;当它们不相等时,表达式返回 false
在Java中,“!=” 是一个用于比较两个值是否不相等的运算符,它可以用于比较数值、字符、布尔值以及对象引用的不等性, 当被比较的两个值不相等时,表达式返回 true;当它们相等时,表达式返回 false
关系运算符,是有结果的,结果是boolean类型的
11.2.1实战案例
1.练习1,==
2.练习2,==
补充
11.3逻辑运算符
&&(并且) ||(或) !(非)
关系运算符 可以理解为一个条件,如果有多个条件, 就需要用逻辑运算符来进行连接
11.3.1实战案例
1.练习1,&&,||
2.练习2,||
3.练习3,!
11.4位运算符
位运算即先拆分成二进制,然后按位做运算
-
&与运算: 若都是1结果是1,否则是0
-
|或运算: 若都是0则为0,有一个是1就是1
-
^异或: 相同为0,不同为1
-
>>: 转换成二进制右移 通常/2
右移原理同左移 -
<<: 转换成二进制左移 通常*2
左移就在后面补0,左移几位就乘以2的几次方,如下
-
>>>: 无符号右移,不管是正是负左侧(高位)都补0
-
短路与、或
如果是逻辑运算符,以boolean表达式1 && boolean表达式2为例,如果表达式1是false,java不会走表达式2,因为不论表达式2是true还是false,整体结果都是false,所以java会选择短路操作,如果是位运算,没有这个说法,两个表达式都会执行
11.5赋值运算符
11.5.1实战案例
1.练习1,+=
2.练习2,字符串拼接
3.练习3,+=,在下图这段代码中,变量 b2 的数据类型仍然是 byte,虽然在计算 b2 += 3; 这行代码时,会将右侧的表达式 b2 + 3 中的 3 隐式转换为 int 类型,但最终结果会被自动转回 byte 类型,然后再赋值给 b2
Java会进行这种隐式的类型转换是为了确保代码的兼容性和安全性。在对 b2 += 3; 进行计算时,首先将 b2 的值 2 加上 3,得到结果 5。然后,将 5 转换回 byte 类型,并将结果 5 赋值给 b2
因此,尽管在计算过程中会涉及 int 类型,但 b2 的数据类型仍然是 byte
注:若是如下图这样赋值则需要强制转换
11.6三目运算符
11.6.1 格式
boolean表达式?值1:值2(两个值类型一样)
解释: 如果布尔表达式为true,三目运算的值就是值1,否则是值2
11.6.2实战案例
1.练习1,若大于10岁结果是1,否则是0
2.练习2,判断输入的数据,若是1就显示男生,否则显示女生
左边的值是什么类型,右边就要用相应类型去承接,如下,左边"男生女生"是字符串类型,所以右边需要用字符串类型去承接
3.练习3,判断学生的成绩,90以上为A,60-90为B,否则为C
三目是可以嵌套的,如下
12.分支
12.1if分支
if是分组的,每一组if会选择一个条件进入
12.1.1一个分支
格式:
if(boolean表达式){
//如果boolean表达式为true,就进入该代码块
}else{
//如果boolean表达式为false,就进入该代码块
{
实战案例: 判断年龄是否到8岁,若到了8岁,就不能看动画片
12.2.1多个分支
格式:
if(boolean表达式){
//如果boolea表达式为true 就进入该代码块
}else if(boolean表达式){
...
}else if(boolean表达式){
...
}else if(boolean表达式){
...
}else{
//如果boolea表达式为false 就进入该代码块
}
实战案例: 判断职务
12.3.1分支嵌套
格式:
if(boolean表达式){
//如果boolea表达式为true 就进入该代码块
if(boolean表达式){
...
}else if(boolean表达式){
...
}else{
...
}
}else{
//如果boolea表达式为false 就进入该代码块
}
实战案例:
开放:到月底了,若手里还有500元以上,出去吃烧烤;若有100元以上,吃小吃部;若50-100,吃泡面;不到50,喝风
隔离:有100以上,点外卖;若50-100,吃泡面;不到50,喝风
System.out.println("请输入状态:");
String s1 = s.next();
System.out.println("请输入余额:");
int i1 = s.nextInt();
if(s1.equals("开放")){
if(i1 > 500){
System.out.println("吃烧烤喽");
}else if(i1 >= 100 && i1 <= 500){
System.out.println("勉强吃小吃部吧");
}
}else if(s1.equals("隔离")){
if(i1 > 100){
System.out.println("被隔离,点外卖吧");
}
}else if(s1.equals("没钱")){
if(i1 >= 50 && i1 <= 100){
System.out.println("吃康师傅红烧牛肉面");
}else if(i1 < 50){
System.out.println("别吃了哥们儿,喝西北风吧");
}
}
12.2.Switch分支
12.2.1格式
switch(变量){
case 值1:
[break;]
case 值2:
[break;]
....
default://如果前面的case都不满足,会进入default,相当于else
}
12.2.2实战案例
1.练习1,判断季节
String season = "4";
switch(season){
case "春":
System.out.println("好");
break;
case "夏":
System.out.println("真好");
break;
case "秋":
System.out.println("特别好");
break;
case "冬":
System.out.println("冬天东北有暖气,nice");
break;
default:
System.out.println("打错了");
}
运行后结果如下
2.练习2,判断状态,若是工作日则上课,否则休息
int week = 7;
switch(week){
case 1:
System.out.println("上课");
break;
case 2:
System.out.println("上课");
break;
case 3:
System.out.println("上课");
break;
case 4:
System.out.println("上课");
break;
case 5:
System.out.println("上课");
break;
default:
System.out.println("休息");
}
运行后结果如下
注:
1.从满足条件的case进入,一直向后执行,遇到第一个break退出,如果一直没有break的话则不会退出,default中的代码也会执行
2.季节、红绿灯、星期等这些不常改变的,非范围的会使用 switch这种方式
简化代码(case 0:case 1:)如下
switch(week){
case 1:
case 2:
case 3:
case 4:
case 5:
System.out.println("上课");
break;
case 6: case 7://可以像上面case12345一样竖着写,也可以这样横着写
System.out.println("休息");
break;
default:
System.out.println("打错了");
}
3.练习3,牛奶返利:伊利,蒙牛返5%;安慕希,金典,纯真:20%;完达山,古城:30%
Scanner s = new Scanner(System.in);
System.out.println("请输入想查询返利的牛奶:");
String milk = s.next();
switch (milk){
case "伊利": case "蒙牛":
System.out.println("返利5%");
break;
case "安慕希": case "金典": case "纯甄":
System.out.println("返利20%");
break;
case "完达山": case "古城":
System.out.println("返利30%");
break;
default:
System.out.println("输入有误,请重新输入");
}
运行后结果如下
4.练习4,判断成绩等级,60以上为等级A,否则为等级B
//练习四:60分以上等级为A,否则为B
System.out.println("请输入您的成绩:");
int score = s.nextInt();
switch(score/60){
case 1:
System.out.println("您的成绩为:A");
break;
case 0:
System.out.println("您的成绩为:B");
break;
default:
System.out.println("您的输入有误");
}
注:
1.switch中的变量也可以做一些特殊的处理,如:
switch(score/60){case 0:case 1:}这种
2.switch接收的变量有类型限制:
byte、short、char、int、String、枚举
3. 值1值2是变量的值
13.Scanner
Scanner是一个辅助工具,Scanner是一个扫描器,会扫描在控制台(Console) 中输入的数据
13.1实战案例
13.1.1练习1,基本Scanner练习,创建一个扫描仪
13.1.2练习2,有两个数a和b,若a能被b整除,或者a和b的和大于1000,则输出a,否则输出b
13.1.3.练习3,开放:到月底了,若手里还有500元以上,出去吃烧烤;若有100元以上,吃小吃部;若50-100,吃泡面;不到50,喝风;隔离:有100以上,点外卖;若50-100,吃泡面;不到50,喝风
System.out.println("请输入状态:");
String s1 = s.next();
System.out.println("请输入余额:");
int i1 = s.nextInt();
if(s1.equals("开放")){
if(i1 > 500){
System.out.println("吃烧烤喽");
}else if(i1 >= 100 && i1 <= 500){
System.out.println("勉强吃小吃部吧");
}
}else if(s1.equals("隔离")){
if(i1 > 100){
System.out.println("被隔离,点外卖吧");
}
}else if(s1.equals("没钱")){
if(i1 >= 50 && i1 <= 100){
System.out.println("吃康师傅红烧牛肉面");
}else if(i1 < 50){
System.out.println("别吃了哥们儿,喝西北风吧");
}
}
运行结果如下
注:
1.nextInt接受int类型,同理,.nextDouble接受double类型
2.输入中文时,尽量将光标移到下面
3.多次测试,可能程序还没有执行完,就进行下一次测试了,会忘记关闭程序,注意定期关闭一下
14.循环
循环体:我们负责写一遍,jvm帮我们执行10遍
14.1while循环
14.1.1格式
while(boolean表达式){
//循环体
}
while(age < 8){
//循环条件
System.out.println("可以看动画片");//循环体
age++;//条件变化
}
1、判断 boolean表达式,如果为true,就执行循环体
2、判断 boolean表达式,如果为true,就执行循环体
…
n、判断 boolean表达式,如果为false,就不执行循环体
14.1.2实战案例
14.1.2.1练习1,循环中的计数的变量,常被拿来使用
//我今年n岁了,可以看动画片
while(age < 10){
System.out.println("我今年"+age+"岁了,可以看动画片");
age++;//计数
}
运行结果如下
14.1.2.2练习2,死循环,break,continue
死循环
while(true){
}
break用于退出循环,break常和if一起使用
while(true){
if(age < 10){
System.out.println("我今年"+age+"岁了,可以看动画片");
}else{
break;//退出循环
}
age++;
}
System.out.println(age);
运行结果如下
注:当break只能跳出内层循环,跳不出外层循环时,可以使用如下几种方法
1.判断一下是怎么从内层循环跳出来的,到了外层再判断一下
2.在外层循环加一个标志,如下
nn:while(){
while(){
break nn;
}
}
3.打标志位
原理同方法1
boolean flag = true;
//如果条件改变,flag变为false
if(flag == false){
break;
}
打标志位实例
Scanner s = new Scanner(System.in);
System.out.println("欢迎光临本商店");
int sum = 0;
boolean flag = true;//标志位
while(true){
//输入价格
System.out.println("请输入商品价格:");
int price = s.nextInt();
//输入数量
System.out.println("请输入商品数量:");
int num = s.nextInt();
//共计,继续(1),结算(2),其他键报错
sum += price*num;
System.out.println("此次消费共计"+sum+"元,继续购买请按1,结算请按2");
//判断按键
int key;
while(true){
key = s.nextInt();
if(key == 1){
break;
}else if(key == 2){
//直接结算
flag = false;
break;
}else{
//按错,提示
System.out.println("输入错误,继续购买请按1,结算请按2");
}
}
if(flag == false){
System.out.println("此次消费共计"+sum+"元,欢迎再次光临");
break;
}
}
运行结果如下
continue用于跳出某一次循环
for(int i = 1;i <= 5;i++){
if(i == 3){
continue;//跳出本次循环
}
System.out.println(i);
}
运行结果如下
14.1.2.3练习3,输入银行密码无次数限制
Scanner s = new Scanner(System.in);
System.out.println("您好,请输入密码:");
int i1 = s.nextInt();
while(true){
if(i1 != 128){
//!=比较两个值是否不相等
System.out.println("您好,密码输入错误,请重新输入");
i1 = s.nextInt();
}else if(i1 == 128){
System.out.println("您好,欢迎来到本银行");
break;
}
}
输入银行密码,有次数限制
Scanner s = new Scanner(System.in);
System.out.println("请输入您的密码:");
int i = s.nextInt();
int time = 1;
//假设正确密码为815,共三次输入密码的机会
while(time <= 3){
if(i == 815){
System.out.println("密码正确,欢迎来到本银行办理业务");
break;
}else{
if(time == 3){
System.out.println("输入的密码有误,您的次数已用尽,您的银行账户被暂时锁定");
break;
}
System.out.println("输入的密码有误,请重新输入:");
time++;
i = s.nextInt();
}
}
14.1.2.4练习4,盖一栋楼需要1亿元,有10亿,要盖12栋,盖了一栋还剩9亿,盖了第二栋栋还剩8亿…钱没了,不盖了或者盖完了竣工
int l = 0;
int m = 5;
int n = 5;
while(l <= 9){
l++;
System.out.println("盖了"+l+"栋楼,还剩"+(m-l)+"亿");
if(l == n){
System.out.println("盖完了,竣工");
break;
}
if((m-l) == 0){
System.out.println("没钱了,不能盖楼");
break;
}
}
14.1.2.5练习5,超市收银,题目梗概如下
欢迎光临
请输入商品价格
5
请输入商品数量
2
共消费10元,继续购买请按1,结算请按2,退出请按3
1
请输入商品价格
6
请输入商品数量
1
共消费16元,继续购买请按1,结算请按2
2
您此次共消费16元,请付款,欢迎下次光临
Scanner s = new Scanner(System.in);
System.out.println("欢迎光临本超市");
int sum = 0;
while (true) {
System.out.println("购买请按1,结算请按2,退出请按3");
int key = s.nextInt();
if (key == 1) {
// 购买
System.out.println("请输入商品价格");
int p = s.nextInt();
System.out.println("请输入商品数量");
int n = s.nextInt();
sum += p * n;
} else if (key == 2) {
// 结算
System.out.println("您此次共消费" + sum + "元,请付款,欢迎下次光临");
break;
} else if (key == 3) {
// 退出
System.out.println("欢迎下次光临");
break;
} else {
// 输入有误,重新输入
System.out.println("输入有误,请重新输入");
}
}
运行结果如下
14.2do while循环
14.2.1格式
do{
循环体
}while(boolean表达式);
14.2.2实战案例
public static void main(String[] args) {
int age = 3;
do{
System.out.println("看动漫喽");
age++;
}while(age < 7);
}
运行结果如下
14.3for循环
14.3.1格式
for(初始化某变量(1);循环条件(2);变量变化(3)){
循环体(4)
}
运行顺序为