2023年6月20日发(作者:)
.
第一章 到 第十二章
day01Java开发前奏(第1章)
IT行业
硬件
- 各种硬件, 技术含量越高,价格越贵。
软件
- 看不到,摸不着。
软件比硬件值钱得多!!!
iPhone 5 - 5000
制造成本400块——其他在品牌,在软件。
美国几乎不造硬件——硬件不如软件挣钱。
程序 —— 软件的核心部分
程序:当我们要做一件事情时,需要按一种既定的流程、步骤,依次完成每个过程,
——最后结果就出来了。
真正的程序员,会影响他的生活习惯,做所有事情,都会有计划,有步骤。
计算机程序: 驱动机器去为我们按既定流程、步骤去完成某件事情。
. .
=======计算机是很蠢的!它只会按我们规定的步骤去做事=======
Java能做什么?
1. 做桌面软件。—— 针对个人。
Java在桌面软件领域、并不流行。
MS,win8向“移动操作系统”转型。
2. 大型信息化系统。(Java最擅长) —— 针对企业。
taobao(阿里软件)、各种银行系统、证券、电信、移动 ……
3. 移动互联网软件。 —— 针对个人。
Android
编程语言的运行机制
程序: 驱动机器去为我们按既定流程、步骤去完成某件事情。
能直接驱动计算机的 —— 机器指令。(难度非常大)
→ 汇编 → 高级语言(C、Java……)
高级语言编程: 源代码就像“作文”一样,容易编写。
但高级语言的源代码,机器看不懂,但人容易看懂、容易编写。
. .
学编程的所有工具安装准则:
1. 不要安装在有空格的路径下。
2. 不要安装在有中文的路径下。
(1) 安装JDK.
(2) 既然要使用Java开发,经常需要使用javac、java命令。
执行计算机命令的两个方法
A。 每次运行命令时,都输入该命令的绝对路径。
——可行,坏处是麻烦。
B。 告诉系统,总是到某些目录下去找命令。
这就需要PATH环境变量: 它的值是N条路径。中间以分号隔开。
用于告诉操作系统, 以后操作系统要找命令时,就依次在这N条路径中找,
如果找到了,操作系统就执行这些命令。
如果没找到,操作系统就提示:“不是内部或外部命令,也不是可运行的程序”
PATH环境变量的作用:告诉【操作系统】到哪些路径下去找【命令】。
/*******************
. .
绝对路径 :以盘符开始的路径,就是绝对路径。
c:
相对路径: 不以盘符开始的路径,就是相对路径。
*******************/
/**********
启动dos窗口, 运行→ cmd
打开“快速编辑模式”,即可用“右键”完成复制、粘贴。
cd 路径 进入指定路径。
特殊路径:
根路径。
. 当前路径。 >符号前的就是当前路径。
.. 上一级路径。
dir: 列出该路径下的所有文件和目录。
切换盘符: 直接输入盘符:即可。
**********/
. .
Java程序的最小程序单元: 类。
要定义类
[修饰符] class <类名>
{
}
[修饰符] ,只能是public。
Java程序,如果要运行,必须有个入口方法:main方法:
public static void main(String[] args)
{
}
Java源文件的命名规则:
1. 文件名必须以.java为后缀
2. 如果源文件中定义了public修饰的类,主文件名必须与类名相同。
一个Java源文件,可以包含多个类定义。
但一个Java源文件最多只能包含一个public修饰的类。
. .
编译Java程序的命令:
javac -d 目录 源文件的文件名
指定将生成的新文件放在哪里。
javac生成的新文件名的命名规则: 类名.class
(每个类,对应一个class文件)
运行Java程序的命令:
java 类名
关于CLASSPATH环境变量的解释:
1. CLASSPATH环境变量可以不设置。
2. CLASSPATH环境变量的作用?
CLASSPATH环境变量的作用:告诉【JVM】到哪些路径下去找【类】。
CLASSPATH环境变量的值,依然是N条路径,路径之间用分号隔开。
3. 如果你不设置CLASSPATH环境变量,相当于CLASSPATH的值是一个点(.)
如果你设置CLASSPATH环境变量,记得要加上一点(.)。
. .
Java程序的注释:
注释的作用: 给人(包括自己)看的。
注释:对程序本身,不存在任何影响。
建议: 总是为程序添加合适的注释。
注释: 还可用于调试程序,可以把程序中某段代码先注释掉。
对于程序员来说,还有一个更重要的能力:排错。
1. 先多遇到错误,多解决错误。
2. 常见的错误,记下来引起错误的原因。
注释分为3种:
单行注释: //
多行注释: /* */
文档注释: /** */
——它可用于生成API文档。
作业:
10个类,分别在屏幕上打印不同的形状:三角形、正方形、长方形……
. .
day02数据类型与运算符(第3章)
Java语言的运行机制:
它既想吸收编译型语言的速度快的优点,又想吸收解释型语言“跨平台”的优点
它变成了一个“既需【编译】(平台无关的字节码文件)、又需要JVM的【解释】”的语言。
Java语言的程序,速度快,而且能跨平台。
编译Java程序的命令:
. .
javac -d <目录> 源文件的路径
运行Java程序的命令:
java 类名
只要做Java开发,javac、java这两个命令是必需的。
是由Oracle的JDK所提供的。
SDK(Software Develop Kits)
JDK (Java 的SDK)
开发Java之前的准备:
(1) 安装JDK。
Java for Developer(JDK) JRE + 各种编译工具。
Java for Your Computer(JRE)
JRE (Java的Runtime Enviorment) = JVM + 基础类库、程序
(2) 由于我们需要使用javac、java命令。
如果不配置环境变量,每次使用javac、java命令时,都需要输入命令的绝对路径。
可以配置PATH环境变量,它的值是N条路径(以;隔开),以后你输入任何命令时,操作系统都会在PATH所指定的系列路径中搜索。
. .
Java程序的最小结构单元: 类。 面向对象。
【C程序的最小结构单元: 函数。 面向过程】
写Java程序,定义类:
[修饰符] class <类名>
{
// 入口方法、开始点
public static void main(String[] args)
{
// 执行性代码
n();
}
}
注释:
1. 单行注释。 //
2. 多行注释。 /* */
3. 文档注释。 /** */
文档注释的作用:
. .
javadoc可以直接提取源代码中文档注释,生成对应的【API文档】。
何为API文档?
当我们写了一些类之后,应该为这些类编写“使用说明书”。
javadoc命令: 程序员只要在源代码中添加文档注释,javadoc就可以为提取注释,生成使用说明书【API文档】。
API文档
包列表区 | 详细说明区
---------|
类列表区 |
文本编辑器: notopad、vim(最老牌、经典文本编辑工具)、ultraedit、editplus。
生成API文档的步骤:
(1) 在源代码中添加文档注释。
文档注释必须添加在 类、方法、field、内部类 之前才有效。
——如果你把文档注释放在其他地方,它只能多行注释。
(2) 使用javadoc命令:
javadoc -d <路径> 源文件
变量
. .
- 编程就要操作数据。数据就要放在“东西”中。
- 变量的作用:“装”一切的数据。通俗理解:可以把变量理解成“瓶子”。
- 变量需要有个名字(标识符)。通过该名字即可访问变量
分隔符:
所有的符号,都是英文符号。
空格、 花括号 、[] 、() .
标识符:(identifier)
名字
- 只能由于字母(包括中文字符)、数字、下划线、$组成,其中数字不能开头。
- 标识符不能是Java的关键字或保留字。
关键字:
48个。
2个保留字:(goto、const)——现在还没有使用,也许以后会用。
3个直接量: true、false、null。就是值。
这53个都不能作为标识符。
Java语言是“强类型”的语言:
- 所有变量,必须先声明(声明时就必须指定类型)、后使用。
. .
- “什么样的瓶子只能转什么东西”, 指定类型的变量,只能装相应类型的值。
Java的数据类型可分为2大类:
- 基本类型。
- 引用类型。
整型(byte、short、int、long)
↗
浮点型(float、double)
↗
基本类型 → 字符型(char)
↘
布尔型(boolean) 只有2个值: true、 false
整型:
byte(1个字节(byte)=8个位(bit))
8个bit表示2的8次方种状态。 因此一个bit只能表示256个数。
byte的取值范围: -128~0~127
short(2个字节(byte)=16个位(bit))
16个bit表示2的16次方种状态。能表示65536个数。
short的取值范围: -32768~0~32767
int (4个字节(byte)=32个位(bit))
. .
int的取值范围: 负的2的31次方~0~2的31次方-1
long (8个字节(byte)=64个位(bit))
long的取值范围: 负的2的63次方~0~2的63次方-1
/**********************
2的10次方:1024 - 1K
2的20次方: 1M(百万)
2的30次方: 1G(十亿)
2的40次方: 1T
***********************/
1. 当我们直接给出一个整数值时,它默认是int型。
系统绝不会把它当成long处理。
2. 当我们直接给出一个在指定取值范围内的整数时,系统也可把它当成byte、short使用。
3. 如果你系统把一个整数当成long使用,应该在整数后添加l或L。
数值的下划线用法。
可以在数值中任意添加下划线(_)作为分隔符。
整数一共支持4种表示形式:
10进制值。 默认。
16进制 Ox或0X开头 0~9、a、b~f(15)
. .
8进制 O开头 0~7
2进制 b或B开头 0~1
123 1 * 【进制】的2次方 + 2 * 【进制】的1次方 + 3 * 【进制】的0次方。
0x1a = 1 * 16的1次方 + a * 16的0次方 = 26
整数不能除以0,否则会引发“算术异常:ArithmeticException”
浮点型:
float :4个字节,32位。
double:8个字符,64位。
带小数的数值,就是浮点型。
- 当你直接给出一个带小数的数值时,它默认是double型。
如果希望当成float使用,应该在数值后添加f或F。
- 浮点数支持2种形式:
-给出带小数的数。
-科学计数法。 2.11133E3
- 浮点型有3个特殊值:
正无穷大 Infinty 正数除以0,得到无穷大。
● 所有正无穷大都相等。
负无穷大 -Infinity 负数除以0,得到无穷大。
. .
● 所有负无穷大都相等。
非数 NaN : 0 除以0, 对负数开方等。
非数与任何数都不相等,包括它自己!
字符型
char
Java用就是Unicode字符集
字符型占2个字节,16位, 65536种状态。
- 字符型也可以当成无符号整型(0~65535)(每个字符都有编号)用。
- 字符型的值,应该用单引号引起来。
(双引号引起来的是字符串)。
- 字符型有3种形式:
A。 '字符'
B。 转义字符。 'n' 't' P50的表3.2
C。 直接用字符的Unicode编号。
布尔型
boolean
它只有两个值: true、 false。
. .
数值型: byte、short、int、long、char、float、double
↗
基本类型
↘
布尔型: boolean
/****************************************
字符集
计算机底层、内存中都无法记录字符,它们只能记录010101这种二进制位。
但我们有字符需要保存到计算机中,计算机科学家想了一个办法,给字符编号
计算机底层使用、保存这些字符时,其实用的的这些字符的编号。
——如果给所有字符都编号,这就叫字符集。
所谓字符集:就是给所有字符编个号。
字符集: 保存(写入)文件 、恢复(读取)文件用的字符集要一致。
ASCII - 每个字符占一个字节,8bit,总共能表示256个字符。
A(65)- Z(65+25)
a(97)- z(97+25)
0(48)- 9(57)
GB2312
GBK
. .
GB18030
Unicode :16位、 能表示65536个字符。
utf-8、utf-16。
编程:建议使用utf-8字符集。
*****************************************/
▲ 类型转换
☆ 自动转换
取值范围小的类型,可以自动转换为取值范围大的类型。
(-128~127) (-32768~32767) (-20亿~20亿)
byte → short → int → long
double
↗
char
(0~65535)
- 所有数值型,都可自动转换为double。
- 所有整型,都可自动转换为long。
- 所有整型,都可自动转浮点型。
.
→ float → .
☆ 强制转换。
当数值类型之间,不能自动转换时就需要进行强制转换。
强制转换的语法格式是: (类型)
【注意】,强制转换,可能会溢出。
/***********************************
数值的表示形式:
最高位是符号位, 0代表正数; 1代表负数。
原码 - 直接换算得到的2进制码。
反码 - 把原码,除符号位之外,其他位取反得到反码。
补码 - 正数的补码就是源码;负数的补码为反码+1
计算机底层,所有数值都用补码表示。
************************************/
随机的图形验证码
(1)只要生成一个97~122(汉字的范围)之间的随机整数
(2)将随机整数,强转为char——这就是随机字符。
. .
Math类:所有与数学计算相关的算法,都提供了相应的方法。
表达式类型的自动提升
所谓表达式:用运算符,将多个变量、值,串联成“四则混合运算”。
一个表达式,最终也会计算出一个结果,该结果的数据类型,
与整个表达式中等级最高的操作数的数据类型相同。
▲ 直接量
直接量,就是在源代码中直接给出的值。
int: 20、 0x12 、 12、012
long: 1L、 23L
float: 2.4f
double 2.3 3e2
char: '1' 、'u2331'
boolean: true 、false
String: "helloworld"
▲ 运算符
☆算术运算符:
+ : 加法运算符,也是连接运算符。
. .
- : 减法运算符。
* : 乘法运算符。
/ : 除法
% : 取余。
++ : 必须操作【一个】【变量】,让变量的值加1
-- : 必须操作【一个】【变量】,让变量的值减1
++ 如果放在变量的前面,是先将变量加1,再用加1后的值;
如果放在变量的后面,是先用变量原始的值;将变量加1。
-- 如果放在变量的前面,是先将变量减1,再用减1后的值;
如果放在变量的后面,是先用变量原始的值;将变量减1。
☆ 赋值运算符
=
☆ 位运算符
& : 按位与 ——当上下两位都是1,计算结果才是1.
| : 按位或 ——当上下两位都是0,计算结果才是0;只要有任何一个是1,结果就是1。
^ : 按位异或——当上下两位不同,计算结果才是1.
~ : 按位取反(按位非)。直接取反——只要一个运算数即可。
>>: 右移,右边移出去的位,将会被直接“砍掉”, 左边空出来的位补符号位。
. .
右移N位,相当于除以2的N次方。
<<: 左移,右边空出来的位就会添加0;
左移N位,相当于乘以2的N次方。
>>>:无符号右移,右边移出去的位,将会被直接“砍掉”,左边空出来的位总是补0。
移出来的结果总是正数。
练习:
画出下面计算结果的过程
-12 & 34
(byte)234;
-3^34
20 | -124
~45
day03流程控制和数组(第4章)
数据类型与运算符
Java数据类型可分为2大类:
. .
- 基本类型
- 引用类型
基本类型
A。 整型 byte short int long
有4种表示形式:
10进制、8进制(以0开头)、16进制(以0X或0x开头)、2进制(以B或b开头、Java 7才支持)
B。 浮点型。float(4个字节)、double(8个字节)
直接给出小数,默认是double类型;如果希望一个数字是float类型,需要添加f/F作为后缀。
C。 字符型。
字符型可以当成无符号整型使用(0~65535)
字符型有3种表示形式:
- 直接给出单个字符 'A'
-转义字符。
- 'uXXXX',用4位的16进制的Unicode值。
D。 布尔型。
true、false
另外一种分类规则:
A。 数值型: byte、short、int、long、char、float、double
. .
B。 布尔型:boolean
7个数值型之间可以相互转换,
- 自动转换 : 取值范围小的、向取值范围大的转换,就可自动转换。
byte → short → int → long → float → double
↗
char
- 强制转换: 不能自动转换时,就需要进行强制转换。
语法格式是: (类型)
【强制转换可能导致溢出!!!!!!】
运算符:
算术运算符: + - * % / ++ --
赋值运算符: =
位运算符: & | ^ ~ >>(左边高位补符号位,右移N位相当于除以2的N次方)、<<(左移N位相当于乘以2的N次方)、>>>
▲ 扩展后的赋值运算符:
所有【双目】运算符,都可以与=结合,结合成为扩展的赋值运算符。
a += b 相当于 a = (a的类型)(a + b)
. .
a -= b
...
a &= b
▲ 比较运算符
比较运算符,返回的结果是true或false
> >= < <= == !=
【比较运算符的返回值总是boolean值!】
▲ 逻辑运算符
逻辑运算符的作用是: 对两个boolean值进行逻辑运算。
逻辑运算符,只能对boolean值进行运算。
&& :与。当两个操作数都是true时、才返回true。
&: 不短路与。
|| : 或。当两个操作数只要有一个是true时、就会返回true。
|: 不短路或
!: 非 : 它是单目的。相当于取反。
^: 异或。 当两个操作数相同时,结果就会返回false。
&&与&的区别何在?
对于“求与”来说,当第一个操作数已经是false时、结果肯定是false,第二个操. .
作数根本不会影响结果。
&&,根本不会去计算第二个操作数。
&, 它依然会去计算第二个操作数。
||与|的区别何在?
对于“求或”来说,当第一个操作数已经是true时、结果肯定是true,第二个操作数根本不会影响结果。
||,根本不会去计算第二个操作数。
|, 它依然会去计算第二个操作数。
▲ 三目运算符
boolean表达式 ?value1 : value2
当boolean表达式返回true,整个表达式返回value1;否则,就返回value2
▲ 运算符的结合性与优先级
运算符有优先级, 一共分成10多个级别的优先级。参看P67.
规则: 尽量多用()来保证哪些东西先算。
▲ 流程控制
目前,最主流、最常用的3种流程:
1. 顺序。 从上到下、依次执行每条代码。
. .
如果没有流程控制,默认就是顺序结构。
在顺序结构中,如果后面代码得到了执行,表明前面代码已经执行完成。
2. 分支。
根据条件来执行执行代码。
if语句。
if语句的语法格式:
㊀
if(<逻辑表达式>)
{
// 执行语句
}
{}括起来的部分,称为“条件执行体”。
㊁
if(<逻辑表达式>)
{
// 执行语句
}
. .
else
{
// 执行语句
}
㊂
if(<逻辑表达式>)
{
// 执行语句
}
else if(<逻辑表达式>) else if块可出现0~N次。
{
// 执行语句
}
else else块可出现0~1次
{
// 执行语句
}
★ if分支语句的注意点:
A. 如果if后的条件执行体只有一行代码,可以省略条件执行体的花括号。
如果if后省略花括号, if条件只控制到紧跟该if语句的第一个分号。
. .
建议: 总是保留条件执行体的花括号。
B. else包含了一个隐含的条件: 该条件就是对前面条件取反。
建议:当有if...时候,应该先判断【范围小】的条件。
Java 7增强后switch语句,
语法格式是这样的:
switch(<表达式>) // 此处的表达式可以是byte、short、char、int、String(Java7)、枚举
{
break;
case 值2:
break;
case 值3:
break;
default: //
case 值1: case块可出现1~N次
}
. .
Java会去计算<表达式>的值,如果表达式的值与后面指定case的值相同时,就会进入执行对应的case代码块。
switch允许省略case块的break;
如果switch省略了case后面break后,从第一个能进入的case块开始,然后一直执行每个case块的代码(此时根本不判断case后的值),此时根本不会判断case后的值。
3. 循环(回圈)
控制程序将一段多次重复执行。
★ while循环
while(<逻辑表达式>)
{
// 循环体
}
每次进入循环体之前,会先去判断<逻辑表达式>,如果<逻辑表达式>返回true,就会进行循环体。
只要逻辑表达式为true,就会一直重复执行循环体。
. .
当<逻辑表达式>为false时,此时就会跳出循环(执行循环体花括号后面的代码)。
<逻辑表达式>的执行次数 = 循环体的执行次数 + 1
【注意:】 如果while循环的循环体只有一行代码,可以省略循环体的花括号。
如果省略了while循环体的花括号, while只控制紧跟while的第一个分号。
【练习】 用星号打印三角形
*
***
*****
*******
*********
***********
高 : N
一共要打印 6 行。
结论:每行打印的空格数: 高度 - 行数
每行打印的*数: 2 * 行数 - 1
★ do while循环
. .
do
{
}while(<逻辑表达式>);
先执行循环体,然后再去判断逻辑表达式,如果逻辑表达式为true,执行下一次循环。
- 即使逻辑表达式开始就是false,循环体也会执行一次。
do while循环的循环体至少会执行一次。
- 循环体的执行次数 = 逻辑表达式的执行次数。
★ for循环
- 【语法更简洁】。
- 【内聚性更好】。
for(初始化语句; 逻辑表达式 ; 迭代语句)
{
// 循环体
}
◆初始化语句:仅在循环开始之前,执行一次!
◆逻辑表达式:每次进行循环体之前,都要先判断逻辑表达式的值。
// 循环体
. .
当逻辑表达式返回true,就会进行循环体。
如果逻辑表达式返回false,跳出循环。
逻辑表达式的执行次数 = 循环体的执行次数 + 1
◆迭代语句: 每次循环体执行完之后、判断循环条件之前,会自动执行迭代语句。
迭代语句的执行次数 = 循环体的执行次数
可以用while循环来改写for循环,改写后为如下形式:
初始化语句
while (逻辑表达式)
{
// 循环体
迭代语句
}
【注意点】
- 如果在循环体中修改循环计数器的值,循环体的执行次数可能会发生变化。
- for循环中,只有两个分号是必须的。
如果没有逻辑表达式,相当于逻辑表达式总是true。
- for循环的初始化语句,可以一次声明多个变量。这多个变量的类型必须相同。
. .
/****** 死循环:无限循环 *******/
课堂练习: 打印99乘法表
1 * 1 = 1
1 * 2 = 2,2 * 2 = 4
1 * 3 = 3,2 * 3 = 6 , 3 * 3 = 9
1 * 9
结论:
- 总共打印MAX_NUM行
- 每行要打的token数量 = 行数
▲ 控制循环结构:
break - 跳出一个循环。
直接调到循环体的后一条代码。
即使是死循环,我们也可以使用break来跳出循环。
★ 默认情况,break只是跳出它所在的循环。
循环可以带标号 —— 所谓标号,就是为循环起个名字。.
9 * 9 = 81
.
标号的语法格式为: 标识符: ——这就是为循环起了个名字。
★ 如果在break后添加标签,可以直接跳出标签代表的循环。
continue - 忽略本次循环剩下的语句、重新开始下一次循环。
结论:如果一个【不带标号】的continue语句,而且它是循环体的最后一条语句,这个continue语句没有作用。
★ 默认情况,continue只是忽略它所在的循环的剩下语句。
★ 如果在continue后添加标签,可以直接忽略标签所代表循环的剩下语句。
return - 可用于结束一个方法。
return 无论它在多深的嵌套循环中,只要遇到return语句,它会结束方法,整个循环将会完全结束。
1. 找出2000以内的所有“水仙花”数字
找出2000以内所有
各位的数值的立方的和 = 该数本身。
比如: 153 = 1 + 125 + 27
2. 打印圆
(对于有难度,就做将三角形再打个反向,就成了菱形)
. .
**
*************
*****************
*****************
*****************
************
day04流程控制和数组(第4章) **
Java的流程控制
第一种:顺序结构
如果我们要做的一件事情,本身是从上到下、按既定的步骤依次执行,
此时就可考虑使用顺序结构。
编程思路: 我要的事情,可定义为一个一个小任务,接下来就将每条任务都翻译为相应程序代码。
第二种:分支结构
如果我们要做的事情,要根据具体的条件来决定是否执行。
此时就可考虑使用分支结构。
. .
Java的分支结构有两种:
★ if
if(条件)
{
// 条件执行体
}
else if( 条件) —— 它可以出现0~N次
{
// 条件执行体
}
...
else —— 它可以出现0~1次
{
// 条件执行体
}
1. 当条件执行体只有一行代码时,程序可以省略条件执行体的花括号。
省略花括号之后, if只控制到紧跟它的第一个分号。
2. else本身就是一个条件。else相当于是对前面的条件取反。
. .
经验:当有多个else if块,你应该先去处理范围小的条件。
★ switch
switch(表达式) // 表达式的类型可以byteshortcharintString(Java 7)枚举
{
case 值1: ——可出现1~N次。
// 执行代码
break;
case 值2:
// 执行代码
break;
default: ——隐含条件是:表达式的值不等于前面任意一个值
}
【注意点:】
如果省略了break,流程会从第一个能进入的case块开始,依次向下执行每个case块,根本不会比较case后面的值,
——直到遇到break为止。
第二种:循环结构
如果有一件事情,需要多次重复执行,
. .
此时就考虑使用循环结构。
Java的循环结构,一共有3种:
while(条件)
{
// 循环体
}
条件的计算次数 = 循环体的执行次数 + 1
【注意点:】
当循环体只有一行代码时,程序就可以省略循环体的花括号。
如果省略了循环体的花括号,while只控制到紧跟它的第一个分号。
do
{
// 循环体
}while(条件)
即使条件开始就是false,循环体也会执行一次,循环体至少会执行一次。
for(初始化语句; 条件 ; 迭代语句)
. .
{
// 循环体
}
初始化语句,只在循环开始之前执行一次。
条件, 每次进入循环体之前,先要计算条件为true或false。
当条件为true时,才能进入循环体;为false将不能进入循环体。
条件的执行次数 = 循环体的执行次数 + 1
迭代语句,每次循环体执行完之后,程序就会执行迭代语句。
迭代语句总是放在循环体之后执行。
▲ 数组:
变量 - 程序中需要保存数据时,就可考虑使用变量来装数据。
变量,需要指定类型、名字。
数组 - 当程序中有N个数据类型完全相同的变量时,此时就可考虑使用一个数组来代替这个N个变量。
当有一个数据需要保存时,就考虑使用变量;当有N个数据需要保存时,就考虑使用数组。
Java数据类型:
- 基本类型:8个。
. .
- 引用类型:数组类型,类,接口。
8个基本类型、String。
★ 数组就是一种类型。
int → int[] (数组类型)
String → String[] (数组类型)
int[] → int[][] (数组类型)
int[][] → int[][][] (数组类型)
★ 定义数组变量的语法,应该是标准写法
int[] 变量名
String[] 变量名
早期定义数组变量的语法是:
int 变量名[]; —— 这个写法几乎被淘汰了,
★ 数组类型的变量,只是一个引用变量。定义数组变量,仅仅只是定义了一个指针。
何为引用变量、何为指针
1. 基本类型的值,需要的空间是固定。
2. 引用类型的值,需要的空间是不确定。
. .
当我们把数据存在计算机的内存中之后,每个内存位都有自己的编号,
可以额外定义一个变量,该变量保存数组所在内存的编号。——这种变量就叫“指针”。
引用变量 , 本质就是指针。但它是一个包装后、功能被限制、更安全的指针。
引用变量、存放的是内存编号。
引用变量所占的内存空间是确定、受平台所控制的。
定义数组变量时, 数组本身并没有出现。
★ 创建数组(数组初始化)
new —— 新建
几乎所有东西,都可以new出来。
创建数组的两种语法:
静态:
new 类型[] {元素1, 元素2 , 元素3 ...};
1. 程序员不指定长度。
2. 只列出元素的值;由系统来动态判断数组的长度。
. .
动态:
new 类型[长度];
1. 程序员只指定长度。
2. 不给出数组元素的值,而是由系统地为每个元素分配元素值。
系统为数组元素分配值的规则为:
1. 所有整型,初始值都为0;
2. 所有浮点型,初始值都是0.0
3. 所有字符型,初始值都是'u0000'
4. boolean型 ,初始值是false
5. 所有引用类型,初始值都是null
★ 使用数组:
1. 数组有一个length属性,用于返回该数组的长度。
2. 每个数组元素,相当于一个类型为数组类型去掉【一组】【方括号】的变量。
可通过 数组变量[索引] 可代表数组元素,功能上相当于变量。
使用数组中两个常见的错误:
- 如果使用数组元素时,指定的索引值大于或等于length,将会引发ArrayIndexOutOfBoundsException。
- 当数组变量并未真正指向有效的数组时,,无论访问数组长度、还是访问数组元素时,都将引发NullPointException
. .
★ for each循环
专门用于遍历数组、集合的元素
// 该循环的执行次数 = 数组的长度
for(数组|集合【元素】的类型 变量 : 数组变量|集合变量)
{
// 在该循环体内,上面的变量将会依次等于每个数组元素的值。
}
很明显: for each循环,遍历数组时更加简洁。
foreach循环遍历数组时,一个最大的限制是:【在foreach循环中对数组元素赋值没有任何意义。】
▲ 数组在内存中运行机制:
数组变量、 引用变量——本质是一个包装后、功能被限制的、安全的指针。
在方法中声明的变量,只在方法体内有效,都被称为局部(local)变量
局部变量被放在相应的方法栈内存中
方法栈内存,会随着方法栈内存的结束自动销毁。
每个方法,相当于有自己独立的栈区。
所有由new新建出来的对象,统一放在“堆”内存中。
. .
一个JVM,只持有一块堆内存。
“堆”内存,JVM在运行时分配一块总是存在内存区,JVM退出(java命令结束时),才会销毁堆内存
▲ 没有多维数组
任何已有类型、在后面添加一对方括号,就会产生一个新的类型——数组类型。
int[] → int[][] 多维数组
int[][] → int[][][]
String[] → String[][]
...
▲ 操作数组的工具类
Arrays —— 当我们给一个类、方法等东西起名字时,我们会按全世界大家约定的名字来起名。
这样保证该程序有更好的可读性。
在JDK中,这种操作Xxx的工具类,一般命名为Xxxs。
Arrays包含了如下方法:
binarySearch - 二分法查找,要求数组元素是从小到大排列的。
. .
copyOfRange(long[] original, int from, int to) : 复制数组中间一部分,生成一个新数组。
fill(byte[] a, byte val) : 将数组理指定范围内的元素、全部元素填充某个值。
toString():帮助直接看到数组中所有的元素。 ——这个方法最喜欢。
sort(): 对数组元素进行排序。
作业:
1. 控制台五子棋
2. 人民币转换...
day05Java编程基础实战练习
当我们遇到一个方法,搞不清楚、不懂
——无论你学习任何语言,无论你的技术多么牛,无论你干了多少年,你会一直遇到这个问题。
心理的优势感:这个问题你一定可以搞定。
学会接受:当你遇到一个方法,学会接受它的功能。
当你不知道它的功能,不确定它的功能 → 查文档 → Google →
写一个helloworld小例子。
. .
新名词: 英语名词。汉语名词。
什么是“桌子”? 其实无需知道它是桌子,还是老虎。只要知道它是个【能干什么、起什么作用】东西。
1. 水仙花数
用一个循环,循环控制依次取出1~2000的数,接下来就去判断该数是否符合我们的要求。
2. 在控制台打印圆
经过总结发现:
- 一共打印 2R - 1行
- 每行前面要打印X个空格。
R - R*R - (R-行数)*(R-行数)的开方
接下来要打印Y个星号
2 * R*R - (R-行数)*(R-行数)的开方
3. 简单课堂练习:
直接选择排序 - 最简单、最入门的排序算法
2 ,-12 ,100 , 40 , 20 , 23 , 87
▲
. .
第1轮循环,始终用第1数,依次与后面的每个数进行比较
第1轮的第1次,发现顺序颠倒,就交换。
2 ,-12 ,100 , 40 , 20 , 23 , 87
▲ ▲
-12 2 ,100 , 40 , 20 , 23 , 87
第1轮的第2次,发现顺序颠倒,就交换。
-12 2 ,100 , 40 , 20 , 23 , 87
▲ ▲
第1轮的第3次,发现顺序颠倒,就交换。
-12 2 ,100 , 40 , 20 , 23 , 87
▲ ▲
...
最小的数到了第一个。
第2轮循环,始终用第2数,依次与后面的每个数进行比较
第2小的数到了第2个
第length-1轮循环,
结束
结论: 总共需要N-1轮比较,
. .
第1轮,用第1个数依次与后面的每个数比较。
...
第N-1轮,用第N-1个数依次与后面的每个数比较。
4. 简单课堂练习:
冒泡排序 - 相当简单、相当入门的排序算法
2 ,-12 ,100 , 40 , 20 , 23 , 87
第1轮循环,始终用第j个数,与第j+1个数进行比较,如果顺序颠倒,就交换。
第1轮的第1次,发现顺序颠倒,就交换。
2 ,-12 ,100 , 40 , 20 , 23 , 87
▲ ▲
-12 ,2 ,100 , 40 , 20 , 23 , 87
第1轮的第2次,发现顺序颠倒,就交换。
-12 ,2 ,100 , 40 , 20 , 23 , 87
▲ ▲
第1轮的第3次,发现顺序颠倒,就交换。
-12 ,2 ,100 , 40 , 20 , 23 , 87
▲ ▲
-12 ,2 ,40 , 100 , 20 , 23 , 87
第1轮的第4次,发现顺序颠倒,就交换。
-12 ,2 ,40 , 100 , 20 , 23 , 87
.
2023年6月20日发(作者:)
.
第一章 到 第十二章
day01Java开发前奏(第1章)
IT行业
硬件
- 各种硬件, 技术含量越高,价格越贵。
软件
- 看不到,摸不着。
软件比硬件值钱得多!!!
iPhone 5 - 5000
制造成本400块——其他在品牌,在软件。
美国几乎不造硬件——硬件不如软件挣钱。
程序 —— 软件的核心部分
程序:当我们要做一件事情时,需要按一种既定的流程、步骤,依次完成每个过程,
——最后结果就出来了。
真正的程序员,会影响他的生活习惯,做所有事情,都会有计划,有步骤。
计算机程序: 驱动机器去为我们按既定流程、步骤去完成某件事情。
. .
=======计算机是很蠢的!它只会按我们规定的步骤去做事=======
Java能做什么?
1. 做桌面软件。—— 针对个人。
Java在桌面软件领域、并不流行。
MS,win8向“移动操作系统”转型。
2. 大型信息化系统。(Java最擅长) —— 针对企业。
taobao(阿里软件)、各种银行系统、证券、电信、移动 ……
3. 移动互联网软件。 —— 针对个人。
Android
编程语言的运行机制
程序: 驱动机器去为我们按既定流程、步骤去完成某件事情。
能直接驱动计算机的 —— 机器指令。(难度非常大)
→ 汇编 → 高级语言(C、Java……)
高级语言编程: 源代码就像“作文”一样,容易编写。
但高级语言的源代码,机器看不懂,但人容易看懂、容易编写。
. .
学编程的所有工具安装准则:
1. 不要安装在有空格的路径下。
2. 不要安装在有中文的路径下。
(1) 安装JDK.
(2) 既然要使用Java开发,经常需要使用javac、java命令。
执行计算机命令的两个方法
A。 每次运行命令时,都输入该命令的绝对路径。
——可行,坏处是麻烦。
B。 告诉系统,总是到某些目录下去找命令。
这就需要PATH环境变量: 它的值是N条路径。中间以分号隔开。
用于告诉操作系统, 以后操作系统要找命令时,就依次在这N条路径中找,
如果找到了,操作系统就执行这些命令。
如果没找到,操作系统就提示:“不是内部或外部命令,也不是可运行的程序”
PATH环境变量的作用:告诉【操作系统】到哪些路径下去找【命令】。
/*******************
. .
绝对路径 :以盘符开始的路径,就是绝对路径。
c:
相对路径: 不以盘符开始的路径,就是相对路径。
*******************/
/**********
启动dos窗口, 运行→ cmd
打开“快速编辑模式”,即可用“右键”完成复制、粘贴。
cd 路径 进入指定路径。
特殊路径:
根路径。
. 当前路径。 >符号前的就是当前路径。
.. 上一级路径。
dir: 列出该路径下的所有文件和目录。
切换盘符: 直接输入盘符:即可。
**********/
. .
Java程序的最小程序单元: 类。
要定义类
[修饰符] class <类名>
{
}
[修饰符] ,只能是public。
Java程序,如果要运行,必须有个入口方法:main方法:
public static void main(String[] args)
{
}
Java源文件的命名规则:
1. 文件名必须以.java为后缀
2. 如果源文件中定义了public修饰的类,主文件名必须与类名相同。
一个Java源文件,可以包含多个类定义。
但一个Java源文件最多只能包含一个public修饰的类。
. .
编译Java程序的命令:
javac -d 目录 源文件的文件名
指定将生成的新文件放在哪里。
javac生成的新文件名的命名规则: 类名.class
(每个类,对应一个class文件)
运行Java程序的命令:
java 类名
关于CLASSPATH环境变量的解释:
1. CLASSPATH环境变量可以不设置。
2. CLASSPATH环境变量的作用?
CLASSPATH环境变量的作用:告诉【JVM】到哪些路径下去找【类】。
CLASSPATH环境变量的值,依然是N条路径,路径之间用分号隔开。
3. 如果你不设置CLASSPATH环境变量,相当于CLASSPATH的值是一个点(.)
如果你设置CLASSPATH环境变量,记得要加上一点(.)。
. .
Java程序的注释:
注释的作用: 给人(包括自己)看的。
注释:对程序本身,不存在任何影响。
建议: 总是为程序添加合适的注释。
注释: 还可用于调试程序,可以把程序中某段代码先注释掉。
对于程序员来说,还有一个更重要的能力:排错。
1. 先多遇到错误,多解决错误。
2. 常见的错误,记下来引起错误的原因。
注释分为3种:
单行注释: //
多行注释: /* */
文档注释: /** */
——它可用于生成API文档。
作业:
10个类,分别在屏幕上打印不同的形状:三角形、正方形、长方形……
. .
day02数据类型与运算符(第3章)
Java语言的运行机制:
它既想吸收编译型语言的速度快的优点,又想吸收解释型语言“跨平台”的优点
它变成了一个“既需【编译】(平台无关的字节码文件)、又需要JVM的【解释】”的语言。
Java语言的程序,速度快,而且能跨平台。
编译Java程序的命令:
. .
javac -d <目录> 源文件的路径
运行Java程序的命令:
java 类名
只要做Java开发,javac、java这两个命令是必需的。
是由Oracle的JDK所提供的。
SDK(Software Develop Kits)
JDK (Java 的SDK)
开发Java之前的准备:
(1) 安装JDK。
Java for Developer(JDK) JRE + 各种编译工具。
Java for Your Computer(JRE)
JRE (Java的Runtime Enviorment) = JVM + 基础类库、程序
(2) 由于我们需要使用javac、java命令。
如果不配置环境变量,每次使用javac、java命令时,都需要输入命令的绝对路径。
可以配置PATH环境变量,它的值是N条路径(以;隔开),以后你输入任何命令时,操作系统都会在PATH所指定的系列路径中搜索。
. .
Java程序的最小结构单元: 类。 面向对象。
【C程序的最小结构单元: 函数。 面向过程】
写Java程序,定义类:
[修饰符] class <类名>
{
// 入口方法、开始点
public static void main(String[] args)
{
// 执行性代码
n();
}
}
注释:
1. 单行注释。 //
2. 多行注释。 /* */
3. 文档注释。 /** */
文档注释的作用:
. .
javadoc可以直接提取源代码中文档注释,生成对应的【API文档】。
何为API文档?
当我们写了一些类之后,应该为这些类编写“使用说明书”。
javadoc命令: 程序员只要在源代码中添加文档注释,javadoc就可以为提取注释,生成使用说明书【API文档】。
API文档
包列表区 | 详细说明区
---------|
类列表区 |
文本编辑器: notopad、vim(最老牌、经典文本编辑工具)、ultraedit、editplus。
生成API文档的步骤:
(1) 在源代码中添加文档注释。
文档注释必须添加在 类、方法、field、内部类 之前才有效。
——如果你把文档注释放在其他地方,它只能多行注释。
(2) 使用javadoc命令:
javadoc -d <路径> 源文件
变量
. .
- 编程就要操作数据。数据就要放在“东西”中。
- 变量的作用:“装”一切的数据。通俗理解:可以把变量理解成“瓶子”。
- 变量需要有个名字(标识符)。通过该名字即可访问变量
分隔符:
所有的符号,都是英文符号。
空格、 花括号 、[] 、() .
标识符:(identifier)
名字
- 只能由于字母(包括中文字符)、数字、下划线、$组成,其中数字不能开头。
- 标识符不能是Java的关键字或保留字。
关键字:
48个。
2个保留字:(goto、const)——现在还没有使用,也许以后会用。
3个直接量: true、false、null。就是值。
这53个都不能作为标识符。
Java语言是“强类型”的语言:
- 所有变量,必须先声明(声明时就必须指定类型)、后使用。
. .
- “什么样的瓶子只能转什么东西”, 指定类型的变量,只能装相应类型的值。
Java的数据类型可分为2大类:
- 基本类型。
- 引用类型。
整型(byte、short、int、long)
↗
浮点型(float、double)
↗
基本类型 → 字符型(char)
↘
布尔型(boolean) 只有2个值: true、 false
整型:
byte(1个字节(byte)=8个位(bit))
8个bit表示2的8次方种状态。 因此一个bit只能表示256个数。
byte的取值范围: -128~0~127
short(2个字节(byte)=16个位(bit))
16个bit表示2的16次方种状态。能表示65536个数。
short的取值范围: -32768~0~32767
int (4个字节(byte)=32个位(bit))
. .
int的取值范围: 负的2的31次方~0~2的31次方-1
long (8个字节(byte)=64个位(bit))
long的取值范围: 负的2的63次方~0~2的63次方-1
/**********************
2的10次方:1024 - 1K
2的20次方: 1M(百万)
2的30次方: 1G(十亿)
2的40次方: 1T
***********************/
1. 当我们直接给出一个整数值时,它默认是int型。
系统绝不会把它当成long处理。
2. 当我们直接给出一个在指定取值范围内的整数时,系统也可把它当成byte、short使用。
3. 如果你系统把一个整数当成long使用,应该在整数后添加l或L。
数值的下划线用法。
可以在数值中任意添加下划线(_)作为分隔符。
整数一共支持4种表示形式:
10进制值。 默认。
16进制 Ox或0X开头 0~9、a、b~f(15)
. .
8进制 O开头 0~7
2进制 b或B开头 0~1
123 1 * 【进制】的2次方 + 2 * 【进制】的1次方 + 3 * 【进制】的0次方。
0x1a = 1 * 16的1次方 + a * 16的0次方 = 26
整数不能除以0,否则会引发“算术异常:ArithmeticException”
浮点型:
float :4个字节,32位。
double:8个字符,64位。
带小数的数值,就是浮点型。
- 当你直接给出一个带小数的数值时,它默认是double型。
如果希望当成float使用,应该在数值后添加f或F。
- 浮点数支持2种形式:
-给出带小数的数。
-科学计数法。 2.11133E3
- 浮点型有3个特殊值:
正无穷大 Infinty 正数除以0,得到无穷大。
● 所有正无穷大都相等。
负无穷大 -Infinity 负数除以0,得到无穷大。
. .
● 所有负无穷大都相等。
非数 NaN : 0 除以0, 对负数开方等。
非数与任何数都不相等,包括它自己!
字符型
char
Java用就是Unicode字符集
字符型占2个字节,16位, 65536种状态。
- 字符型也可以当成无符号整型(0~65535)(每个字符都有编号)用。
- 字符型的值,应该用单引号引起来。
(双引号引起来的是字符串)。
- 字符型有3种形式:
A。 '字符'
B。 转义字符。 'n' 't' P50的表3.2
C。 直接用字符的Unicode编号。
布尔型
boolean
它只有两个值: true、 false。
. .
数值型: byte、short、int、long、char、float、double
↗
基本类型
↘
布尔型: boolean
/****************************************
字符集
计算机底层、内存中都无法记录字符,它们只能记录010101这种二进制位。
但我们有字符需要保存到计算机中,计算机科学家想了一个办法,给字符编号
计算机底层使用、保存这些字符时,其实用的的这些字符的编号。
——如果给所有字符都编号,这就叫字符集。
所谓字符集:就是给所有字符编个号。
字符集: 保存(写入)文件 、恢复(读取)文件用的字符集要一致。
ASCII - 每个字符占一个字节,8bit,总共能表示256个字符。
A(65)- Z(65+25)
a(97)- z(97+25)
0(48)- 9(57)
GB2312
GBK
. .
GB18030
Unicode :16位、 能表示65536个字符。
utf-8、utf-16。
编程:建议使用utf-8字符集。
*****************************************/
▲ 类型转换
☆ 自动转换
取值范围小的类型,可以自动转换为取值范围大的类型。
(-128~127) (-32768~32767) (-20亿~20亿)
byte → short → int → long
double
↗
char
(0~65535)
- 所有数值型,都可自动转换为double。
- 所有整型,都可自动转换为long。
- 所有整型,都可自动转浮点型。
.
→ float → .
☆ 强制转换。
当数值类型之间,不能自动转换时就需要进行强制转换。
强制转换的语法格式是: (类型)
【注意】,强制转换,可能会溢出。
/***********************************
数值的表示形式:
最高位是符号位, 0代表正数; 1代表负数。
原码 - 直接换算得到的2进制码。
反码 - 把原码,除符号位之外,其他位取反得到反码。
补码 - 正数的补码就是源码;负数的补码为反码+1
计算机底层,所有数值都用补码表示。
************************************/
随机的图形验证码
(1)只要生成一个97~122(汉字的范围)之间的随机整数
(2)将随机整数,强转为char——这就是随机字符。
. .
Math类:所有与数学计算相关的算法,都提供了相应的方法。
表达式类型的自动提升
所谓表达式:用运算符,将多个变量、值,串联成“四则混合运算”。
一个表达式,最终也会计算出一个结果,该结果的数据类型,
与整个表达式中等级最高的操作数的数据类型相同。
▲ 直接量
直接量,就是在源代码中直接给出的值。
int: 20、 0x12 、 12、012
long: 1L、 23L
float: 2.4f
double 2.3 3e2
char: '1' 、'u2331'
boolean: true 、false
String: "helloworld"
▲ 运算符
☆算术运算符:
+ : 加法运算符,也是连接运算符。
. .
- : 减法运算符。
* : 乘法运算符。
/ : 除法
% : 取余。
++ : 必须操作【一个】【变量】,让变量的值加1
-- : 必须操作【一个】【变量】,让变量的值减1
++ 如果放在变量的前面,是先将变量加1,再用加1后的值;
如果放在变量的后面,是先用变量原始的值;将变量加1。
-- 如果放在变量的前面,是先将变量减1,再用减1后的值;
如果放在变量的后面,是先用变量原始的值;将变量减1。
☆ 赋值运算符
=
☆ 位运算符
& : 按位与 ——当上下两位都是1,计算结果才是1.
| : 按位或 ——当上下两位都是0,计算结果才是0;只要有任何一个是1,结果就是1。
^ : 按位异或——当上下两位不同,计算结果才是1.
~ : 按位取反(按位非)。直接取反——只要一个运算数即可。
>>: 右移,右边移出去的位,将会被直接“砍掉”, 左边空出来的位补符号位。
. .
右移N位,相当于除以2的N次方。
<<: 左移,右边空出来的位就会添加0;
左移N位,相当于乘以2的N次方。
>>>:无符号右移,右边移出去的位,将会被直接“砍掉”,左边空出来的位总是补0。
移出来的结果总是正数。
练习:
画出下面计算结果的过程
-12 & 34
(byte)234;
-3^34
20 | -124
~45
day03流程控制和数组(第4章)
数据类型与运算符
Java数据类型可分为2大类:
. .
- 基本类型
- 引用类型
基本类型
A。 整型 byte short int long
有4种表示形式:
10进制、8进制(以0开头)、16进制(以0X或0x开头)、2进制(以B或b开头、Java 7才支持)
B。 浮点型。float(4个字节)、double(8个字节)
直接给出小数,默认是double类型;如果希望一个数字是float类型,需要添加f/F作为后缀。
C。 字符型。
字符型可以当成无符号整型使用(0~65535)
字符型有3种表示形式:
- 直接给出单个字符 'A'
-转义字符。
- 'uXXXX',用4位的16进制的Unicode值。
D。 布尔型。
true、false
另外一种分类规则:
A。 数值型: byte、short、int、long、char、float、double
. .
B。 布尔型:boolean
7个数值型之间可以相互转换,
- 自动转换 : 取值范围小的、向取值范围大的转换,就可自动转换。
byte → short → int → long → float → double
↗
char
- 强制转换: 不能自动转换时,就需要进行强制转换。
语法格式是: (类型)
【强制转换可能导致溢出!!!!!!】
运算符:
算术运算符: + - * % / ++ --
赋值运算符: =
位运算符: & | ^ ~ >>(左边高位补符号位,右移N位相当于除以2的N次方)、<<(左移N位相当于乘以2的N次方)、>>>
▲ 扩展后的赋值运算符:
所有【双目】运算符,都可以与=结合,结合成为扩展的赋值运算符。
a += b 相当于 a = (a的类型)(a + b)
. .
a -= b
...
a &= b
▲ 比较运算符
比较运算符,返回的结果是true或false
> >= < <= == !=
【比较运算符的返回值总是boolean值!】
▲ 逻辑运算符
逻辑运算符的作用是: 对两个boolean值进行逻辑运算。
逻辑运算符,只能对boolean值进行运算。
&& :与。当两个操作数都是true时、才返回true。
&: 不短路与。
|| : 或。当两个操作数只要有一个是true时、就会返回true。
|: 不短路或
!: 非 : 它是单目的。相当于取反。
^: 异或。 当两个操作数相同时,结果就会返回false。
&&与&的区别何在?
对于“求与”来说,当第一个操作数已经是false时、结果肯定是false,第二个操. .
作数根本不会影响结果。
&&,根本不会去计算第二个操作数。
&, 它依然会去计算第二个操作数。
||与|的区别何在?
对于“求或”来说,当第一个操作数已经是true时、结果肯定是true,第二个操作数根本不会影响结果。
||,根本不会去计算第二个操作数。
|, 它依然会去计算第二个操作数。
▲ 三目运算符
boolean表达式 ?value1 : value2
当boolean表达式返回true,整个表达式返回value1;否则,就返回value2
▲ 运算符的结合性与优先级
运算符有优先级, 一共分成10多个级别的优先级。参看P67.
规则: 尽量多用()来保证哪些东西先算。
▲ 流程控制
目前,最主流、最常用的3种流程:
1. 顺序。 从上到下、依次执行每条代码。
. .
如果没有流程控制,默认就是顺序结构。
在顺序结构中,如果后面代码得到了执行,表明前面代码已经执行完成。
2. 分支。
根据条件来执行执行代码。
if语句。
if语句的语法格式:
㊀
if(<逻辑表达式>)
{
// 执行语句
}
{}括起来的部分,称为“条件执行体”。
㊁
if(<逻辑表达式>)
{
// 执行语句
}
. .
else
{
// 执行语句
}
㊂
if(<逻辑表达式>)
{
// 执行语句
}
else if(<逻辑表达式>) else if块可出现0~N次。
{
// 执行语句
}
else else块可出现0~1次
{
// 执行语句
}
★ if分支语句的注意点:
A. 如果if后的条件执行体只有一行代码,可以省略条件执行体的花括号。
如果if后省略花括号, if条件只控制到紧跟该if语句的第一个分号。
. .
建议: 总是保留条件执行体的花括号。
B. else包含了一个隐含的条件: 该条件就是对前面条件取反。
建议:当有if...时候,应该先判断【范围小】的条件。
Java 7增强后switch语句,
语法格式是这样的:
switch(<表达式>) // 此处的表达式可以是byte、short、char、int、String(Java7)、枚举
{
break;
case 值2:
break;
case 值3:
break;
default: //
case 值1: case块可出现1~N次
}
. .
Java会去计算<表达式>的值,如果表达式的值与后面指定case的值相同时,就会进入执行对应的case代码块。
switch允许省略case块的break;
如果switch省略了case后面break后,从第一个能进入的case块开始,然后一直执行每个case块的代码(此时根本不判断case后的值),此时根本不会判断case后的值。
3. 循环(回圈)
控制程序将一段多次重复执行。
★ while循环
while(<逻辑表达式>)
{
// 循环体
}
每次进入循环体之前,会先去判断<逻辑表达式>,如果<逻辑表达式>返回true,就会进行循环体。
只要逻辑表达式为true,就会一直重复执行循环体。
. .
当<逻辑表达式>为false时,此时就会跳出循环(执行循环体花括号后面的代码)。
<逻辑表达式>的执行次数 = 循环体的执行次数 + 1
【注意:】 如果while循环的循环体只有一行代码,可以省略循环体的花括号。
如果省略了while循环体的花括号, while只控制紧跟while的第一个分号。
【练习】 用星号打印三角形
*
***
*****
*******
*********
***********
高 : N
一共要打印 6 行。
结论:每行打印的空格数: 高度 - 行数
每行打印的*数: 2 * 行数 - 1
★ do while循环
. .
do
{
}while(<逻辑表达式>);
先执行循环体,然后再去判断逻辑表达式,如果逻辑表达式为true,执行下一次循环。
- 即使逻辑表达式开始就是false,循环体也会执行一次。
do while循环的循环体至少会执行一次。
- 循环体的执行次数 = 逻辑表达式的执行次数。
★ for循环
- 【语法更简洁】。
- 【内聚性更好】。
for(初始化语句; 逻辑表达式 ; 迭代语句)
{
// 循环体
}
◆初始化语句:仅在循环开始之前,执行一次!
◆逻辑表达式:每次进行循环体之前,都要先判断逻辑表达式的值。
// 循环体
. .
当逻辑表达式返回true,就会进行循环体。
如果逻辑表达式返回false,跳出循环。
逻辑表达式的执行次数 = 循环体的执行次数 + 1
◆迭代语句: 每次循环体执行完之后、判断循环条件之前,会自动执行迭代语句。
迭代语句的执行次数 = 循环体的执行次数
可以用while循环来改写for循环,改写后为如下形式:
初始化语句
while (逻辑表达式)
{
// 循环体
迭代语句
}
【注意点】
- 如果在循环体中修改循环计数器的值,循环体的执行次数可能会发生变化。
- for循环中,只有两个分号是必须的。
如果没有逻辑表达式,相当于逻辑表达式总是true。
- for循环的初始化语句,可以一次声明多个变量。这多个变量的类型必须相同。
. .
/****** 死循环:无限循环 *******/
课堂练习: 打印99乘法表
1 * 1 = 1
1 * 2 = 2,2 * 2 = 4
1 * 3 = 3,2 * 3 = 6 , 3 * 3 = 9
1 * 9
结论:
- 总共打印MAX_NUM行
- 每行要打的token数量 = 行数
▲ 控制循环结构:
break - 跳出一个循环。
直接调到循环体的后一条代码。
即使是死循环,我们也可以使用break来跳出循环。
★ 默认情况,break只是跳出它所在的循环。
循环可以带标号 —— 所谓标号,就是为循环起个名字。.
9 * 9 = 81
.
标号的语法格式为: 标识符: ——这就是为循环起了个名字。
★ 如果在break后添加标签,可以直接跳出标签代表的循环。
continue - 忽略本次循环剩下的语句、重新开始下一次循环。
结论:如果一个【不带标号】的continue语句,而且它是循环体的最后一条语句,这个continue语句没有作用。
★ 默认情况,continue只是忽略它所在的循环的剩下语句。
★ 如果在continue后添加标签,可以直接忽略标签所代表循环的剩下语句。
return - 可用于结束一个方法。
return 无论它在多深的嵌套循环中,只要遇到return语句,它会结束方法,整个循环将会完全结束。
1. 找出2000以内的所有“水仙花”数字
找出2000以内所有
各位的数值的立方的和 = 该数本身。
比如: 153 = 1 + 125 + 27
2. 打印圆
(对于有难度,就做将三角形再打个反向,就成了菱形)
. .
**
*************
*****************
*****************
*****************
************
day04流程控制和数组(第4章) **
Java的流程控制
第一种:顺序结构
如果我们要做的一件事情,本身是从上到下、按既定的步骤依次执行,
此时就可考虑使用顺序结构。
编程思路: 我要的事情,可定义为一个一个小任务,接下来就将每条任务都翻译为相应程序代码。
第二种:分支结构
如果我们要做的事情,要根据具体的条件来决定是否执行。
此时就可考虑使用分支结构。
. .
Java的分支结构有两种:
★ if
if(条件)
{
// 条件执行体
}
else if( 条件) —— 它可以出现0~N次
{
// 条件执行体
}
...
else —— 它可以出现0~1次
{
// 条件执行体
}
1. 当条件执行体只有一行代码时,程序可以省略条件执行体的花括号。
省略花括号之后, if只控制到紧跟它的第一个分号。
2. else本身就是一个条件。else相当于是对前面的条件取反。
. .
经验:当有多个else if块,你应该先去处理范围小的条件。
★ switch
switch(表达式) // 表达式的类型可以byteshortcharintString(Java 7)枚举
{
case 值1: ——可出现1~N次。
// 执行代码
break;
case 值2:
// 执行代码
break;
default: ——隐含条件是:表达式的值不等于前面任意一个值
}
【注意点:】
如果省略了break,流程会从第一个能进入的case块开始,依次向下执行每个case块,根本不会比较case后面的值,
——直到遇到break为止。
第二种:循环结构
如果有一件事情,需要多次重复执行,
. .
此时就考虑使用循环结构。
Java的循环结构,一共有3种:
while(条件)
{
// 循环体
}
条件的计算次数 = 循环体的执行次数 + 1
【注意点:】
当循环体只有一行代码时,程序就可以省略循环体的花括号。
如果省略了循环体的花括号,while只控制到紧跟它的第一个分号。
do
{
// 循环体
}while(条件)
即使条件开始就是false,循环体也会执行一次,循环体至少会执行一次。
for(初始化语句; 条件 ; 迭代语句)
. .
{
// 循环体
}
初始化语句,只在循环开始之前执行一次。
条件, 每次进入循环体之前,先要计算条件为true或false。
当条件为true时,才能进入循环体;为false将不能进入循环体。
条件的执行次数 = 循环体的执行次数 + 1
迭代语句,每次循环体执行完之后,程序就会执行迭代语句。
迭代语句总是放在循环体之后执行。
▲ 数组:
变量 - 程序中需要保存数据时,就可考虑使用变量来装数据。
变量,需要指定类型、名字。
数组 - 当程序中有N个数据类型完全相同的变量时,此时就可考虑使用一个数组来代替这个N个变量。
当有一个数据需要保存时,就考虑使用变量;当有N个数据需要保存时,就考虑使用数组。
Java数据类型:
- 基本类型:8个。
. .
- 引用类型:数组类型,类,接口。
8个基本类型、String。
★ 数组就是一种类型。
int → int[] (数组类型)
String → String[] (数组类型)
int[] → int[][] (数组类型)
int[][] → int[][][] (数组类型)
★ 定义数组变量的语法,应该是标准写法
int[] 变量名
String[] 变量名
早期定义数组变量的语法是:
int 变量名[]; —— 这个写法几乎被淘汰了,
★ 数组类型的变量,只是一个引用变量。定义数组变量,仅仅只是定义了一个指针。
何为引用变量、何为指针
1. 基本类型的值,需要的空间是固定。
2. 引用类型的值,需要的空间是不确定。
. .
当我们把数据存在计算机的内存中之后,每个内存位都有自己的编号,
可以额外定义一个变量,该变量保存数组所在内存的编号。——这种变量就叫“指针”。
引用变量 , 本质就是指针。但它是一个包装后、功能被限制、更安全的指针。
引用变量、存放的是内存编号。
引用变量所占的内存空间是确定、受平台所控制的。
定义数组变量时, 数组本身并没有出现。
★ 创建数组(数组初始化)
new —— 新建
几乎所有东西,都可以new出来。
创建数组的两种语法:
静态:
new 类型[] {元素1, 元素2 , 元素3 ...};
1. 程序员不指定长度。
2. 只列出元素的值;由系统来动态判断数组的长度。
. .
动态:
new 类型[长度];
1. 程序员只指定长度。
2. 不给出数组元素的值,而是由系统地为每个元素分配元素值。
系统为数组元素分配值的规则为:
1. 所有整型,初始值都为0;
2. 所有浮点型,初始值都是0.0
3. 所有字符型,初始值都是'u0000'
4. boolean型 ,初始值是false
5. 所有引用类型,初始值都是null
★ 使用数组:
1. 数组有一个length属性,用于返回该数组的长度。
2. 每个数组元素,相当于一个类型为数组类型去掉【一组】【方括号】的变量。
可通过 数组变量[索引] 可代表数组元素,功能上相当于变量。
使用数组中两个常见的错误:
- 如果使用数组元素时,指定的索引值大于或等于length,将会引发ArrayIndexOutOfBoundsException。
- 当数组变量并未真正指向有效的数组时,,无论访问数组长度、还是访问数组元素时,都将引发NullPointException
. .
★ for each循环
专门用于遍历数组、集合的元素
// 该循环的执行次数 = 数组的长度
for(数组|集合【元素】的类型 变量 : 数组变量|集合变量)
{
// 在该循环体内,上面的变量将会依次等于每个数组元素的值。
}
很明显: for each循环,遍历数组时更加简洁。
foreach循环遍历数组时,一个最大的限制是:【在foreach循环中对数组元素赋值没有任何意义。】
▲ 数组在内存中运行机制:
数组变量、 引用变量——本质是一个包装后、功能被限制的、安全的指针。
在方法中声明的变量,只在方法体内有效,都被称为局部(local)变量
局部变量被放在相应的方法栈内存中
方法栈内存,会随着方法栈内存的结束自动销毁。
每个方法,相当于有自己独立的栈区。
所有由new新建出来的对象,统一放在“堆”内存中。
. .
一个JVM,只持有一块堆内存。
“堆”内存,JVM在运行时分配一块总是存在内存区,JVM退出(java命令结束时),才会销毁堆内存
▲ 没有多维数组
任何已有类型、在后面添加一对方括号,就会产生一个新的类型——数组类型。
int[] → int[][] 多维数组
int[][] → int[][][]
String[] → String[][]
...
▲ 操作数组的工具类
Arrays —— 当我们给一个类、方法等东西起名字时,我们会按全世界大家约定的名字来起名。
这样保证该程序有更好的可读性。
在JDK中,这种操作Xxx的工具类,一般命名为Xxxs。
Arrays包含了如下方法:
binarySearch - 二分法查找,要求数组元素是从小到大排列的。
. .
copyOfRange(long[] original, int from, int to) : 复制数组中间一部分,生成一个新数组。
fill(byte[] a, byte val) : 将数组理指定范围内的元素、全部元素填充某个值。
toString():帮助直接看到数组中所有的元素。 ——这个方法最喜欢。
sort(): 对数组元素进行排序。
作业:
1. 控制台五子棋
2. 人民币转换...
day05Java编程基础实战练习
当我们遇到一个方法,搞不清楚、不懂
——无论你学习任何语言,无论你的技术多么牛,无论你干了多少年,你会一直遇到这个问题。
心理的优势感:这个问题你一定可以搞定。
学会接受:当你遇到一个方法,学会接受它的功能。
当你不知道它的功能,不确定它的功能 → 查文档 → Google →
写一个helloworld小例子。
. .
新名词: 英语名词。汉语名词。
什么是“桌子”? 其实无需知道它是桌子,还是老虎。只要知道它是个【能干什么、起什么作用】东西。
1. 水仙花数
用一个循环,循环控制依次取出1~2000的数,接下来就去判断该数是否符合我们的要求。
2. 在控制台打印圆
经过总结发现:
- 一共打印 2R - 1行
- 每行前面要打印X个空格。
R - R*R - (R-行数)*(R-行数)的开方
接下来要打印Y个星号
2 * R*R - (R-行数)*(R-行数)的开方
3. 简单课堂练习:
直接选择排序 - 最简单、最入门的排序算法
2 ,-12 ,100 , 40 , 20 , 23 , 87
▲
. .
第1轮循环,始终用第1数,依次与后面的每个数进行比较
第1轮的第1次,发现顺序颠倒,就交换。
2 ,-12 ,100 , 40 , 20 , 23 , 87
▲ ▲
-12 2 ,100 , 40 , 20 , 23 , 87
第1轮的第2次,发现顺序颠倒,就交换。
-12 2 ,100 , 40 , 20 , 23 , 87
▲ ▲
第1轮的第3次,发现顺序颠倒,就交换。
-12 2 ,100 , 40 , 20 , 23 , 87
▲ ▲
...
最小的数到了第一个。
第2轮循环,始终用第2数,依次与后面的每个数进行比较
第2小的数到了第2个
第length-1轮循环,
结束
结论: 总共需要N-1轮比较,
. .
第1轮,用第1个数依次与后面的每个数比较。
...
第N-1轮,用第N-1个数依次与后面的每个数比较。
4. 简单课堂练习:
冒泡排序 - 相当简单、相当入门的排序算法
2 ,-12 ,100 , 40 , 20 , 23 , 87
第1轮循环,始终用第j个数,与第j+1个数进行比较,如果顺序颠倒,就交换。
第1轮的第1次,发现顺序颠倒,就交换。
2 ,-12 ,100 , 40 , 20 , 23 , 87
▲ ▲
-12 ,2 ,100 , 40 , 20 , 23 , 87
第1轮的第2次,发现顺序颠倒,就交换。
-12 ,2 ,100 , 40 , 20 , 23 , 87
▲ ▲
第1轮的第3次,发现顺序颠倒,就交换。
-12 ,2 ,100 , 40 , 20 , 23 , 87
▲ ▲
-12 ,2 ,40 , 100 , 20 , 23 , 87
第1轮的第4次,发现顺序颠倒,就交换。
-12 ,2 ,40 , 100 , 20 , 23 , 87
.
发布评论