Java编程基础
- 关键字与标识符
(1) 关键字与标识符是什么?
Java程序是为了解决现实问题的,为了在程序中协助人们解决问题,就需要在程序中将现实问题的场景模拟出来。
现实 |
程序 |
各种各样的事物 |
模拟各种各样的事物 |
各个真实事物都有自己的名字 |
程序中事物也有自己的名字 |
有很多特定含义的名词:太阳、地球、粉笔盒、自行车、楼房、厕所 |
关键字 |
现实中事物都有自己的名字 |
标识符 |
家长给孩子起名字尽量避开这些有特定含义的词汇 |
java程序中给事物起标识符使用关键字是否合理? |
举例说明现实中给孩子起名字使用特定词汇的不合理性。 引导学生思考java程序中给事务起名字使用关键字是否合理? |
总结:
关键字:java中有特定含义的词汇
标识符:java中给新创建的各个事物起的名字
(2) Java中常用关键字
关键字需要记住,但不需要大家强迫记忆,见多了就记住了。
(3) Java中会给那些事务起标识符(命名)?
包、类、方法、参数、变量的名字
注意:
Java标识符内字母区分大小写
Num与num在java中就是两个不同的标识符
标识符长度不限
字母区分大小写的程序语言:JAVA、C、C++、C#等
有的程序语言是不区分字母大小写的如:vb、html、css等
(4) 标识符命名规则?
名称必须以字母、 _(下划线)或$符号开头
num _num $num
不建议用 $符号 _(下划线)作为变量名的首字母
有些特定场合才会用到_(下划线)或$符号开头的标识符
不能用数字开头
8num
不能使用Java的关键字
byte short int long
(5) 课堂练习
下面哪些标识符命名是合法的?
indentifier class
username 98.3
user_name Hello World
_userName Welcome+Tom
$userName sizeof
(6) Java中保留字(不是关键字,但是起标识符不能用)
const
goto
(7) 在大的命名规则下,针对不同应用场景,标识符又有不同命名规范
(变量、类、方法、常量)
user
userName
userFirstName
注:标识符遵循驼峰式写法
Hello
HelloWorld
HelloWorldImpl
注:标识符遵循驼峰式写法
PI
run()
getName()
getUserName()
- 基本数据类型(ppt 75页)
(1) 程序最初的出现就是为了解决一些计算问题的。所以,任何程序天然都具备计算的本质,java也是如此。
(2) 现实中常见的数据分类:
10:整数
10.2:小数
(3) 程序中数据分类
基本数据类型:常用计算问题中会用到
引用数据类型:后续扩展计算用,现在不讲,但需记住引用数据类型有哪些。
Ppt 77页 Ppt 77页 Ppt 77页
(4) 现实中数据存储方式
写在一张纸上
记录在电脑文件里面:word、记事本、excel
吃饭:30
(5) 数据在电脑中存储方式
0 |
1 |
1 |
0 |
0 |
0 |
0 |
1 |
0 |
1 |
1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
物理上电脑存储数据有基本存储单元,在每个基本存储单元利用高电压和低电压分别表示1和0,所以电脑硬盘中存储的数据就是无数的0和1,也就是说,电脑很笨,只认识0和1。我们保存的一个文本,一张图片,一部电影都是由无数的0和1构成的。
每个基本存储单元我们叫一个比特: bit,代表1位基本存储单元,简称1位,我们常用 b表示。
1b=1bit=1位=一个基本存储单元
我们把8个连续的基本存储单元合起来叫一个字节: byte,代表8位基本存储单元,我们常用B表示。
1B=1字节=8bit=8位=八个基本存储单元
(6) 整形数据类型
byte: 占用8个基本存储单元 : 8b: 8位 :1B : 1字节
short:占用16个基本存储单元 :16b: 16位 :2B :2字节
int: 占用32个基本存储单元 :32b: 32位 :4B :4字节
long: 占用64个基本存储单元 :64b: 64位 :8B : 8字节
(7) 所有的数据要在程序中参与运算的时候必须存放在内存的某块区域中才能进行下一步的运算,那么如何在内存中开辟某个类数据存储空间以存放对应的数据呢?
① 通过定义变量的方式:
int a; //
在内存中开辟了一块空间
变量名前面的数据类型对变量空间做了限制
byte a;
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
short b;
1 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
② 程序中定义的变量在程序运行的时候都会占用内存对应的空间。
③ 内存中常用的区域空间:堆、栈
④ 变量在内存中如何表示
⑤ 变量:表示在内存中开辟了一块指定存储内容的空间,只能存储指定类型的数据。变量==某个存储空间
⑥ 变量所代表的空间都在栈中。
(8) 变量定义(声明)和赋值
① 先定义再赋值
int a;
a=10;
② 定义的同时赋值
int a=10;
③ 程序中要参与运算的数字必须通过放入变量的方式才能存在于内存中。
④ 注意:这里的单等号(=)是赋值符号。
(9) 为什么整数类型要分类(byte、short、int、long)
数据存储空间是一个按照数据类型一次分配的连续空间。
根据不同的数据场景分配不同的数据类型可以节省空间
比如:做 -128---127 之间的数据运算只需要放在byte类型的数据存储空间就够了,不需要long类型的空间
(10) 小练习
计算100与200的和
思路:将100放入变量a,将200放入变量b,变量计算a+b就可以得到结果
int a=100;
int b=200;
int c=a+b;
System.out.println(c);
变量a是某个数据空间的别名,在前面定义变量后,后面可以直接根据变量名来获取a所代表的数据空间里面的值。
(11) 整型课堂练习:
定义byte、short、int、long类型变量
int num = 0x10; //十六进制
int num2 = 010; //八进制
int num3=9; //十进制
byte byteNum=12;
short num4=10;
long l = 100L;
long l=999999;
long l=9999999999;//错误
9999999999超出了int的范围所以通不过编译。
(12) 程序编码格式说明
① 代码格式重要性
② 缩进
(13) 浮点型(单精度浮点型:float,双精度浮点型:double)
Ppt 80 页
float: 占用32个基本存储单元 : 32b: 32位 :4B : 4字节
double:占用64个基本存储单元 : 64b: 64位 :8B :8字节
定义float类型的变量并赋值
float f=2.5f;
定义double类型的变量 并赋值
double d=2.5;
double d=2.5d;
系统自动将带小数的数字识别为double类型的数字。
浮点型小练习:
float f = 1.0F;
double d = 1.0D;
double d = 1.0;
2e3f
3.6d
.4f
0f
3.84d
5.022e+23f
(14) 字符型
定义字符
char c=’a’;//英文单引号括起来的单个字符
char c=’\u0000’;//用英文单引号括起来的十六进制字符代码值来表示的单个字符
现实中存储在计算机中的字符在计算机底层都是以一个一个数字的形式存储的。那么字符对应的数字是多少呢?Unicode提供了规则。
Unicode(统一码、万国码、单一码)是一种在计算机上使用的字符编码。它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。1990年开始研发,1994年正式公布。随着计算机工作能力的增强,Unicode也在面世以来的十多年里得到普及。
(15) 转义字符
\b 退格 \u0008
\t 制表 \u0009
\n 换行 \u000a
\r 回车 \u000b
\” 双引号 \u0022
\’ 单引号 \u0027
\\ 反斜杠 \u005c
(16) 布尔型 boolean
现实中表示一个问题的对错,我们用对或错,真或假来表示问题的对与错结果。那么在程序中我们用true或false来表示这个结果。而存储true或false的数据类型称为布尔(boolean)类型。
我们用一个boolean变量来存储一个布尔值。
boolean b=true;
boolean b1=false;
boolean 1位 true/false
boolean b=true;
(17) 回顾八个基本数据类型
(18) 基本数据类型的封装类
基本数据类型 |
byte |
short |
int |
long |
float |
double |
char |
boolean |
对应封装类型 |
Byte |
Short |
Integer |
Long |
Float |
Double |
Character |
Boolean |
最大值和最小值的记忆很复杂,用对应封装类型可以获取:
Integer.MAX_VALUE取得int类型的最大值;
Integer.MIN_VALUE取得int类型的最小值;
(19) 自动类型转换
Java是强类型语言一种类型和另一种类型之间是不能相互转化的,但是基本数据都是和数字与基本计算相关的,所以他们之间可以有一定的转换。
1000000000+0.00000000001=
在上图中,有6个实箭头,表示无数据丢失的转换;有3个虚箭头,表示可能有精度损失的转换。
各类型转换的具体规则:
(1)布尔型和其它基本数据类型之间不能相互转换;
(2)byte型可以转换为short、int、long、float和double;
(3)short可转换为int、long、float和double;
(4)char可转换为int、long、float和double;
(5)int可转换为long、float和double;
(6)long可转换为float和double;
(7)float可转换为double;
小练习:
字符转int
//可以将字符放在字符变量中,在将字符类型转换成int类型
char c=’A’;
int i=c;
//也可以直接将字符放在int变量中
int a=’A’;
(20) 强制类型转换
解决问题:
Int--》byte转换
Int a=4660;
Byte b=a;
A、不能直接转换
B、但可以通过强制类型转换来进行转换。
变量 = (目标类型) 值;
byte a;
int b=4660;
a = (byte) b;
转化结果=》52
C、但转换结果和原始值不一致,原因如下:
D、强制类型转化的通俗解释:
小强要将一个装满开水的大水杯中的水倒入一个小水杯(b=a;),旁边的大人就告诉他这样不行并阻止他这样做(保存并编译代码时系统会报错)。但小强是个很听不进去别人话的人,一定要这样做,并写了保证书说出了任何问题和别人没关系(进行强制类型转换 b=(byte)a;),别人就不再阻止他这样做了(保存并编译代码成功)。
E、小练习
下面这串数字有什么含义?
21452 20307 31995 27426 36814 20320
public static void main(String[] args) { //将6个数字放到6个int变量中 int i1=21452; int i2=20307; int i3=31995; int i4=27426; int i5=36814; int i6=20320; //将int类型强制类型转换成char类型 char a=(char)i1; char b=(char)i2; char c=(char)i3; char d=(char)i4; char e=(char)i5; char f=(char)i6; System.out.println(a+" "+b+" "+c+" "+d+" "+e+" "+f); } |
- 运算符
运算是程序天然就具备的属性,现在开始了解常见的运算符有哪些。我们常见的运算分为:算术运算、赋值运算、比较运算、逻辑运算等几类运算。而每种运算又包含多种运算符。下面我们来逐个介绍。
(1) 算术运算符
① 算术运算符有哪些
② 解释
public class Test {
public static void main(String[] args) { int a=10; int b=4; System.out.println(+b); System.out.println(-b);//输出结果: -2 //加法运算 int res1=a+b; System.out.println("a+b="+res1);// 输出结果:14 //减法运算 int res2=a-b; System.out.println("a-b="+res2);//输出结果:6 //乘法运算 int res3=a*b; System.out.println("a*b="+res3);//输出结果:40 //除法运算 //对于除号”/”,它的整数和整数做除法时,只保留整数部分而舍弃小数部分 int res4=a/b; System.out.println("a/b="+res4);//输出结果:2 //取模运算 int res5=a%b; //运算过程:res5=a-(a/b)*b=10-(10/4)*4=10-2*4=10-8=2 System.out.println("a%b="+res5);//输出结果:2
//自增运算符 //单等号 ‘=’ 是赋值运算符号 //++在变量前:变量先自增1,再将自增后的结果参与到运算中 int res6=++a; System.out.println("res6="+res6+" a="+a);//res6=11 a=11 //++在变量后:变量先使用原始值进行运算,之后变量再自增1 int res7=a++; System.out.println("res7="+res7+" a="+a);//res7=11 a=12 //自减运算符 //--在变量前:变量先自减1,再将自减后的结果参与到运算中 int res8=--a; System.out.println("res8="+res8+" a="+a);//res8=11 a=11 //--在变量后:变量先使用原始值进行运算,之后变量再自减1 int res9=a--; System.out.println("res9="+res9+" a="+a);//res9=11 a=10
} } |
③ 运算结果类型
public class Test2 { public static void main(String[] args) { double d=1.1d; float f=2.5f; long l=10l; int i=20; short s=5; //double –当操作数中有double类型时 double res1=d+f+l+i+s; System.out.println(res1); //float–当操作数中有float类型时 float res2=f+l+i+s; System.out.println(res2); //long–当操作数中有long类型时 long res3=l+i+s; System.out.println(res3); //int int res4=i+s; System.out.println(res4); } } |
(2) 赋值运算符
① 赋值运算符有哪些
=、+=、-=、*=、/=、%= |
② 实例说明
+=
|
public static void main(String[] args) { int a=10; float b=20; a+=b;//a=(int)(a+b) System.out.println("a="+a+" b="+b); } 输入结果: a=30 b=20 |
-=
|
public static void main(String[] args) { int a=10; int b=20; a-=b; System.out.println("a="+a+" b="+b); } 输入结果: a=-10 b=20
|
*=
|
public static void main(String[] args) { int a=10; int b=20; a*=b; System.out.println("a="+a+" b="+b); } 输入结果: a=200 b=20
|
/=
|
public static void main(String[] args) { int a=100; int b=20; a/=b; System.out.println("a="+a+" b="+b); } 输入结果: a=5 b=20
|
%=
|
public static void main(String[] args) { int a=10; int b=3; a%=b; System.out.println("a="+a+" b="+b); } 输入结果: a=1 b=3 |
(3) 比较运算符
① 关系运算符有哪些
现实中我们通常比较两个数字的大小关系有:
大小关系有哪些 |
现实大小关系描述 |
现实中结果表示 |
程序中大小关系描述 |
程序结果表示 |
等于 |
1等于2 |
错 |
1==2? |
false |
不等于 |
1不等于2 |
对 |
1!=2? |
true |
大于 |
1大于2 |
错 |
1>2? |
false |
小于 |
1小于2 |
对 |
1<2? |
true |
大于等于 |
1大于等于2 |
错 |
1>=2? |
false |
小于等于 |
1小于等于2 |
对 |
1<=2? |
true |
instanceof:此运算符用于检查某个对象是否属于某个类型,在面向对象讲完后讲解。 |
其他七个基本数据类型不能直接和布尔类型进行类型转换,但是通过关系运算可以和布尔类型建立关系
② 关系运算的运算元素:数字(除instanceof之外的关系运算符)
③ 实例
运算符 |
程序 |
输出结果 |
== |
System.out.println(1==2); |
false |
!= |
System.out.println(1!=2); |
true |
> |
System.out.println(1>2); |
false |
< |
System.out.println(1<2); |
true |
>= |
System.out.println(1>=2); |
false |
<= |
System.out.println(1<=2); |
true |
④ 发现
1) 除instanceof之外的其他关系运算的运算数都是数字。
2) 关系运算的结果是true或false,是boolean的值,所以关系运算的结果可以放在一个boolean类型的变量中。
3) boolean类型通过关系运算与其他基本数据类型建立关系。
(4) 逻辑运算符:
① 逻辑运算符有哪些?
与 && :二元运算符
或 || :二元运算符
非 ! :一元运算符
② 逻辑运算的运算元素:布尔值或结果是布尔值的表达式
③ 具体描述
运算符 |
表达式 |
逻辑运算符运算规则 |
&& |
true&&true |
参与 与运算的元素是两个布尔值,只有两边都为true运算结果才为true,否则结果都为false |
|| |
true||false |
参与 或运算的元素是两个布尔值,只要有一边为true结果就为true,两边都为false结果才为false |
! |
!true |
参与运算的元素是一个布尔值,做取反运算 |
④ 实例具体分析
与运算符 |
或运算符 |
非运算符 |
|||
实例分析 |
运算结果 |
实例分析 |
运算结果 |
实例分析 |
运算结果 |
true&&true |
true |
true||true |
true |
!true |
false |
true&&false |
false |
true||false |
true |
!false |
true |
false&&true |
false |
false||true |
true |
|
|
false&&false |
false |
false||false |
false |
⑤ 发现
1) 与运算符的运算结果优先由false值决定运算结果,只要运算数中出现了false,结果就为false
2) 或运算符的运算结果优先由true值决定运算结果,只要运算数中出现了true,结果就为true
3) 如果与运算符的第一个运算数为false的时候,第一个运算数已经决定了整个运算表达式的运算结果,第二个值就没有必要参与运算;
如果或运算符的第一个运算数为true的时候,第一个运算数已经决定了整个运算表达式的运算结果,第二个值就没有必要参与运算;
我们把与运算第一个运算数出现false及或运算第一个运算数出现true的情况,第二个元素就不参与运算的现象叫做短路现象(与运算短路、或运算短路)
4) 逻辑运算的运算结果是布尔值
5) 逻辑运算的运算数直接是布尔值的时候其实没有实际应用价值。
6) 逻辑运算的运算
⑥ 应用实例
public static void main(String[] args) { boolean b=(1>4)&&(5<7); //与运算短路 System.out.println(b); boolean b1=(4>1)||(5<7); //或运算短路 System.out.println(b1); }
|
给定年份,判断指定的年份是平年还是闰年: public static void main(String[] args) { //某年能被4整除并且不能被100整除,或者能被400整除 int n=2020; boolean b=((n%4==0)&&(n%100!=0))||(n%400==0); System.out.println(b); } |
⑦ 总结:
1) 通常变量、关系运算、逻辑运算会结合起来解决实际问题。只有表达式中出现了变量,并且变量里面的值不断的变化,这个表达式才有实际应用意义;如果表达式里面都是固定的值,这个表达式也就没有应用意义了。
2) 通过不断的练习,只要能把实际问题用程序语言描述出来,那程序自然会帮你把问题解决。
3) 我们学习的是软件翻译课程,不是软件编程课程。我们要做的只是将现实问题用软件语言描述出来。
(5) 三元运算符
① 语法格式:
② 实例
根据年龄判断一个人是成年还是未成年:输入结果1代表成年,0代表未成年 public static void main(String[] args) { int age=18; int flag=0; flag=(age>=18?1:0); System.out.println(flag); } |
(6) 运算符优先级
|
- 程序控制流程
(1) 程序控制流程解决程序中哪些问题?
① 选择类问题
② 循环类问题
(2) 程序控制流程有哪些
① 选择结构
if
if...else...else
switch
② 循环结构
while
do...while
for
(3) 选择类问题
接下来就选择类问题给大家举例说明。
① if结构:只对条件成立做处理
语法结构 |
if(条件){ //此处条件为一个布尔值或结果是布尔值的表达式 语句组; } 注: 1.当条件为true时执行if花括号里面的语句;当条件为false时,不执行花括号里面的语句。 2.当执行语句只有一条语句时,花括号可以省略不写,但程序可读性会降低,不建议省略。 3.当执行语句为多条语句时,花括号必须写。 |
实际问题 |
1.货车从货场装货出发将货物送往目的地,途中会经过超重检查站; 2.如果货车装载货物超重,在检查站接受处理并继续出发到达目的地; 3.如果货车装载货物没有超重,则顺利通过检查站到达目的地。 |
流程图 |
|
实例代码 |
public static void main(String[] args) { int weight=10; System.out.println("货车在货源地装货"); System.out.println("货车出发"); System.out.println("货车经过超重检查站"); //30吨及以下不超重,30吨以上为超重 if(weight>30){ System.out.println("===货车接受检查站处理==="); } System.out.println("货车到达目的地"); } |
② 单分支选择结构:if...else结构:条件成立与否都做处理
语法结构 |
if(条件){ //此处条件为一个布尔值或结果是布尔值的表达式 语句组1; }else{ 语句组2; } 注: 1.当条件为true时执行if花括号里面的语句;当条件为false时,执行else花括号里面的语句。 2.当执行语句只有一条语句时,花括号可以省略不写,但程序可读性会降低,不建议省略。 3.当执行语句为多条语句时,花括号必须写。 |
实际问题 |
根据年龄判断是成年还是未成年 |
流程图 |
|
实例代码 |
public static void main(String[] args) { int age=17; if(age>=18){ System.out.println("成年"); }else{ System.out.println("未成年"); } } |
③ 多分支选择结构if...else...else结构
语法结构 |
if(条件1){ //此处条件为一个布尔值或结果是布尔值的表达式 语句组1; }else if(条件2){ 语句组2; }else....if(条件n){ 语句组n; }else{ 语句组n+1; } 注: 1.当某个条件为true时执行对应if花括号里面的语句;当条件为都不成立时,执行else花括号里面的语句。 2.当执行语句只有一条语句时,花括号可以省略不写,但程序可读性会降低,不建议省略。 3.当执行语句为多条语句时,花括号必须写。
|
实际问题 |
根据成绩判断所处成绩段 如果成绩大于等于90并且小于等于100,优秀 如果成绩大于等于80并且小于90,良好 如果成绩大于等于60并且小于80,及格 其他分数,不及格 |
流程图 |
|
实例代码 |
public static void main(String[] args) { int cj=98; if(cj>=90&&cj<=100){ System.out.println("优秀"); }else if(cj>=80&&cj<90){ System.out.println("良好"); }else if(cj>=60&&cj<80){ System.out.println("及格"); }else{ System.out.println("不及格"); } } |
延伸思考 |
多分支选择结构之间可以不加else么? |
④ switch结构
语法结构 |
switch(表达式){//此处表达式为byte、short、int、char、字符串等类型的值 case 常量值 1: 语句(组)1; break; case 常量值 2: 语句(组)2; break; case 常量值 N: 语句(组)n; break; default: 语句(组); } 注: 1.当表达式值与某个常量值相同时,执行对应常量值后面的语句组。 2.当表达式与所有常量值都不相同的时候,执行default后面的语句组。 |
实际问题 |
公司根据年终评级发放奖金 A:50000元 B:30000元 C:10000元 其他:1000元 |
流程图 |
|
实例代码 |
public static void main(String[] args) { char gread='B'; switch(gread){ case 'A': System.out.println(50000); //break; case 'B': System.out.println(30000); //break; case 'C': System.out.println(10000); //break; default: System.out.println(1000); } } |
延伸思考 |
每个case后面如果不加break会有什么后果。 |
⑤ If...else...else与switch对比
相同点 |
功能对等,一定的条件下可以互换 |
不同点 |
判断条件不同 if-else 条件为布尔值:true/false、关系运算表达式、逻辑运算表达式、关系运算与逻辑运算混合表达式 switch 条件为byte、short、char、int、字符串等类型的值 |
|
使用if...else...else 与switch计算指定月份天数,不考虑平年闰年 |
互换使用及break的作用 |
if...else...else写法: public static void main(String[] args) { int m=3; if(m==1||m==3||m==5||m==7||m==8||m==10||m==12){ System.out.println(31); }else if(m==4||m==6||m==9||m==11){ System.out.println(30); }else{ System.out.println(28); } } Switch写法:如果连续的多个case都不写break,相当于多个条件之间为或关系;break终止当前结构,跳出去。 public static void main(String[] args) { int m=3; switch(m){ case 1: case 3: case 5: case 7: case 8: case 10: case 12: System.out.println(31); break; case 4: case 6: case 9: case 11: System.out.println(30); break; default: System.out.println(28); } } |
(4) 循环类问题
① while结构:有限次数循环和无限次数循环
语法结构 |
while(条件){//此处条件为布尔值或运算结果是布尔值的表达式 语句组; } 循环结构之后后的其他代码 注: 1.条件成立返回true时,执行花括号里面的语句。 2.语句执行完毕,再次回到条件判断处继续下一次判断。 3.条件不成立返回false,退出结构。 4.如果条件一开始就不成立,循环一次都不会执行。 5.当语句组是单条语句时,花括号可以省略不写,不建议省略。 6.当执行语句为多条语句时,花括号必须写。
|
实际问题 |
累加1--100的整数的和 |
流程图 |
|
实例代码 |
public static void main(String[] args) { int i=101; int sum=0; while(i<=100){ sum+=i; i++; } System.out.println(sum); } |
② 选择结构与循环结构可以相互嵌套使用
实际问题 |
累加1--100之间的偶数的和 |
流程图 |
|
实例代码 |
public static void main(String[] args) { int i=101; int sum=0; while(i<=100){ if(i%2==0){ sum+=i; } i++; } System.out.println(sum); } |
③ do...while
语法结构 |
所有的结构或者语句都必须以花括号或者分号结束 do{ 语句组; }while(条件); //此处需要敲黑板此处条件为布尔值或运算结果是布尔值的表达式 注: 1.进入结构,没有判断条件,直接执行语句 2.判断条件,条件成立并返回true继续执行下一次语句。 3.条件不成立并返回false退出循环结构。 4.不管条件成立不成立,此结构无论如何都会执行一次循环。 5.当前结构以 分号结束 (;)
|
实际问题 |
累加1--100之间的整数和 |
流程图 |
|
实例代码 |
public static void main(String[] args) { int i=1; int sum=0; do{ sum+=i; i++; }while(i<=100); System.out.println(sum); } |
④ For:通常用作有限次数的循环
语法结构 |
for(表达式1;表达式2;表达式3){ } for(循环变量初始化;条件;增量表达式){ 语句组; } for(int i=1;i<=100;i++){ 语句组; } 注: 1.循环变量初始化 2.判断条件,条件成立,执行语句 3.执行增量表达式 4.从第2步开始重新执行过程。 5.条件不成立,跳出循环结构
|
实际问题 |
累加1--1000之间的整数的和 |
流程图 |
|
实例代码 |
public static void main(String[] args) { int sum=0; for(int i=1;i<=1000;i++){ sum+=i; } System.out.println(sum); } |
⑤ continue与break
解释 |
continue:跳过本次循环剩下的语句而执行下一次循环 break:退出当前循环结构。 |
实例 |
在屏幕打印出1--100的数字,遇到10的倍数跳过不输出 |
实例代码 |
Continue: public static void main(String[] args) { for(int i=1;i<=100;i++){ if(i%10==0){ continue; } System.out.println(i); } }
如果用break会有什么效果? public static void main(String[] args) { for(int i=1;i<=100;i++){ if(i%10==0){ break; } System.out.println(i); } }
|
理解对比图 |
|
⑥ 双层for循环:九九乘法表
i j
1 1 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
|
|
33 |
34 |
|
|
|
|
|
|
- 方法
先探讨一个炒菜机是什么样子。
炒菜机名字 |
原材料 |
产出物 |
内部构造 |
西红柿鸡蛋炒菜机 |
各种食材 |
成品菜 |
机械结构 |
根据年月获取指定月份方法 |
数据 |
数据 |
程序语句 |
炒菜机:一台有特定功能的机器 |
|
||
方法:一段有特定功能的代码,可以重复使用,需要的时候可以直接使用 |
|
方法就是一段具有特定功能的代码(数据炒菜机),它可以翻炒各种数据,产出物也是一些数据 注:数据是有类型的
(1) 方法定义
(2) 方法的调用、形参、实参
|
(3) 局部变量
① 在方法或代码块中定义的变量
② 局部变量在使用前必须赋值
③ 超出定义的作用域,就不能再访问局部变量
④ 不能在变量的作用域中重复声明变量
(4) 参数变量与局部变量作用域
(5) Return
① 当返回类型为void时
return; 或者不写
② 其它情况-必须写
return 相应类型的值;
(6) 练习题
从键盘输入两个int类型的数字,使用方法两个数进行加减乘除运算 |
import java.util.Scanner; public class Test4 {
public static void main(String[] args) { Scanner in=new Scanner(System.in); System.out.print("请输入第一个数字:"); int num1=in.nextInt(); System.out.print("请输入第二个数字:"); int num2=in.nextInt();
System.out.println("进行两个整数的加法运算"); int num3=add(num1,num2); System.out.println(num3);
System.out.println("进行两个整数的减法运算"); int num4=subtract(num1,num2); System.out.println(num4);
System.out.println("进行两个整数的乘法运算"); int num5=multiply(num1,num2); System.out.println(num5);
System.out.println("进行两个整数的除法运算"); int num6=division(num1,num2); System.out.println(num6); } //加法 public static int add(int a,int b){ int c=a+b; return c; } //减法 public static int subtract(int a,int b){ int c=a-b; return c; } //乘法 public static int multiply(int a,int b){ int c=a*b; return c; } //除法 public static int division(int a,int b){ int c=a/b; return c; } } |
- 数组
(1) 先解决一个实际问题:
问题 |
通过程序计算某个班第一组的人的java考试成绩的平均值(假设一个组有6个人) |
分析 |
|
程序 |
public static void main(String[] args){ int a1=78; int a2=86; int a3=87; int a4=89; int a5=81; int a6=88; int sum=a1+a2+a3+a4+a5+a6; double avg=sum/6.0;//除6与6.0的区别 System.out.println(avg); } |
延伸理解 |
如果现在要计算全班36个人的java成绩的平均值就有问题了,我们要创建36个变量来存储36个人的成绩,这是很繁琐的,而且也不现实。 |
遇到的问题 |
在一段程序里需要N多个类型相同的变量,如果单个创建很不现实 |
问题的解决: |
使用一个数组来解决。 |
意味着 |
一个数组就相当于N多个类型相同的变量 一个数组就可以代替N多个变量,并且这些变量类型都相同 |
(2) 数组的定义是什么:
① 数组就是一组相同类型的变量的集合,若将这些类型相同的变量的集合起个名字,那么这个名称为数组名。组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。用于区分数组的各个元素的数字编号称为下标。
(3) 数组如何定义
数组的创建 |
int arr[]=new int[6];//创建完成数组后,数组元素只有默认值 int[] arr=new int[6]; int a; int arr[]={1,2,3,4,5,6};//创建完成数组后,数组元素有了指定的值 |
数组的理解 |
|
直接定义的变量和通过数组方式定义的变量区别 |
|
各种类型数组元素中的默认值 |
byte = 0 short = 0 int = 0 long = 0L float = 0.0f double = 0.0d char = '\u0000' boolean = false Object = null |
(4) 数组元素如何访问:使用数组名+下标的方式访问
① 给指定的数组元素赋值
arr[0]=95;
arr[1]=90;
arr[2]=85;
arr[3]=87;
② 获取数组长度:length属性
int leng=arr.length;
③ 访问数组元素
传统方式 |
int arr[]={1,4,2,5,6,9,7}; //传统方式 //使用数组length属性获取数组长度 int len=arr.length; for(int i=0;i<len;i++){ //在循环的过程中循环变量的取值范围是0--5正好是数组下标的编号范围, //所以将循环变量放到数组下标的位置代替下标的值。 System.out.println(arr[i]); }
|
增强for循环 |
int arr[]={1,4,2,5,6,9,7}; //jdk5之后:增强for循环--遍历方式 for(int ele:arr){ System.out.println(ele); } /* for(ElementType element:arrayName){
}; 将数组中的每一个元素依次拿出来放到变量element中并在循环体进行操作 */
|
(5) 数组赋值
public static void main(String[] args){ //数组赋值 int[] arr1={37, 47, 23, -5, 19, 56}; int[] arr2=arr1; arr2[3]=77; System.out.println(arr1[3]); } |
|
(6) 数组拷贝
System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length) src:源数组 srcPos:源数组开始拷贝的元素位置 dest:目标数组 destPos:目标数组存放开始的位置 length:数组拷贝的长度 |
public static void main(String[] args){ //数组赋值 int[] src={37, 47, 23, -5, 19, 56}; int[] dest=new int[10]; System.arraycopy(src, 1,dest, 4, 3); //数组转换成字符串 String arrStr=Arrays.toString(dest); System.out.println(arrStr); } 输出结果:[0, 0, 0, 0, 47, 23, -5, 0, 0, 0] |
(7) java.util.Arrays类,用于操作数组的工具类,提供了大量操作数组的方法
排序(Arrays.sort) |
public static void main(String[] args){ //数组赋值 int[] arr1={37, 47, 23, -5, 19, 56}; //数组排序 Arrays.sort(arr1); //数组转换成字符串 String arrStr=Arrays.toString(arr1); System.out.println(arrStr); } 输出结果:[-5, 19, 23, 37, 47, 56] |
数组转换为字符串(Arrays.toString) |
|
判断数组是否相同(Arrays.equals) |
public static void main(String[] args){ int arr1[]={1,1,1,1,1}; int arr2[]={1,1,1,1,1}; boolean b=Arrays.equals(arr1, arr2); System.out.println(b); } 输出结果:true |
填充值(Arrays.fill) |
public static void main(String[] args){ //数组赋值 int[] arr=new int[6]; //数组全部元素填充为5 Arrays.fill(arr, 5); String arrStr=Arrays.toString(arr); System.out.println(arrStr); //将数组从第1个元素至第3个元素填充为7 //含第1个元素,不含第3个元素 Arrays.fill(arr,1,3,7); String arrStr1=Arrays.toString(arr); System.out.println(arrStr1);
} 输出结果: [5, 5, 5, 5, 5, 5] [5, 7, 7, 5, 5, 5] |
(8) 冒泡法排序
public static void main(String[] args) { int[] arr = {7,6,5,4,3,2,1 }; // 外层循环控制比较轮数 for (int i = 0; i < arr.length; i++) { // 内层循环控制每轮比较次数 for (int j = 0; j < arr.length - i - 1; j++) { // 比较相邻两个元素值大小,前面的大于后面则互换,否则不换 if (arr[j] > arr[j + 1]) { int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } System.out.println(Arrays.toString(arr)); } |
|