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

.