本帖最后由 小石姐姐 于 2017-11-30 09:34 编辑
s1-day01
* Java概述
* 创始人: 詹姆斯高斯林
* Java最初由SUN公司运行, 后来被Oracle收购
* Java版本: (看笔记)
* JDK1.5, 重命名为JavaSE, JavaME, JavaEE
* 目前使用最广泛的Java版本: 7.0, 8.0
* Java语言的平台版本:
* JavaSE: 标准版本, 用于桌面软件开发
* JavaME: 嵌入式版本, 用于嵌入式程序开发
* JavaEE: (重要)企业版本, 开发服务器程序(网站后台, ERP, OA, 银行结算系统)
* 3个概念:
* JVM: Java虚拟机, 他是实现Java跨平台的关键, 不同系统平台上有不同的JVM
* JRE: Java运行时环境, 是运行Java程序的一个最小环境
* 包括JVM和Java核心类库
* JDK: Java开发工具包, 用于开发Java程序
* 包括JRE和Java的开发工具(javac)
* 开发环境配置
* 安装JDK
* Windows下, 使用exe安装包
* 配置环境变量
* 什么是配置环境变量: 将jdk的bin目录放入系统的Path环境变量中, 这样在命令行中在任意目录下都可以使用jdk的bin目录中的命令
* 怎么配置:
* 复制jdk的路径
* 我的电脑右键, 属性, 高级选项卡中, 环境变量, 系统变量:
* 新建一个名为JAVA_HOME的变量名, 值为jdk的路径, 保存
* 找到名为Path的变量, 编辑, 在值的最开始, 添加`%JAVA_HOME%\bin;`, 保存
* 验证环境变量是否配置成功
* 关掉已经打开的cmd, 重新打开cmd
* 在任意目录下输入`java -version`, 如果显示版本, 说明配置成功
* 编写HelloWorld
* 创建一个名为`HelloWorld.java`的文件, 注意这是源代码文件, 以`.java`文件名结尾
* 使用文本编辑器打开该文件, 编写代码
* 定义一个类: `public class 类名 {}`
* 注意: 类名和文件名要一致, 并且单词首字母大写, 其他小写
* 在类中定义主方法: `public static void main(String[] args) {}`
* 注意: 一个字都不能错
* 在主方法中编写代码, 输出语句: `System.out.println("HelloWorld");`
* 保存代码
* 编译源代码文件: `javac 文件名.java`
* 编译完毕后, 会自动生成`.class`文件
* 运行`.class`文件: `java 文件名`
* 注意没有后缀
* Java基本语法
* 3种注释
* 单行注释: `// 注释内容`
* 多行注释: `/* 多行的内容 */`
* 文档注释: `/** 文档注释内容 */`
* 关键字
* 是什么: Java中赋予特殊含义的单词
* 特点:
* 字母小写
* 某些编辑器会高亮显示
* 常量
* 概念: 在程序执行过程中, 其值不能改变
* 分类
* 字符串常量: `"Hello"`
* 字符常量: `'a'`
* 整数常量: `123`
* 浮点数常量: `3.14`
* 布尔常量: `true`
* 空常量: `null`
* 如何使用: 直接使用, 如输入
* 变量
* 概念: 内存中的一片区域, 可以保存值. 在程序的执行过程中, 其值可以在一定范围内发生改变.
* 定义格式:
* `数据类型 变量名 = 初始化值;`
* `数据类型 变量名;`
* 注意事项
* 变量没有赋值不能直接使用
* 变量的作用域只在定义变量所在的大括号内
* 一条Java语句中可以定义多个变量, 这些变量可以有初始化值, 也可以没有. 但不建议
* 数据类型
* 基本数据类型(4类8种)
* 整数
* byte
* short
* int
* long: 数字后加L
* 浮点数
* float: 数字后加F
* double
* 字符
* char
* 布尔
* boolean
* 引用数据类型
* 数组
* 类
* 接口
* 标识符
* 作用: 给包, 类, 方法, 变量起名
* 组成规则:
* Unicode字符
* 数字: 不能开头
* 大写, 小写英文字母
* 汉字: 不建议使用
* 下划线: `_`
* 美元符号: `$`
* 起名的一个惯例: 见名知义
* 类型转换
* 隐式转换: 从数据类型的小到大进行转换
* 规则: `byte, short, char -> int -> long -> float -> double`
* 强制转换: 手动强制转换类型
* 格式: `目标类型 变量名 = (目标类型)(被转换的数据);`
* DOS命令
* 打开cmd:
* `Win + r`, 输入cmd, 回车
* 切换盘符: `d:` , 回车
* 切换目录: `cd 目录名`
* 返回上一层目录: `cd ..`
* 返回该盘符的顶层目录: `cd \`
* 多级目录: `cd a\b\c`
* 查看当前目录中的文件和目录: `dir`
* 查看指定目录下的文件和目录: `dir 目录名`
* 清空屏幕: `cls`
* 退出cmd: `exit`
s1-day02
* Eclipse
* 安装: 解压
* 配置: 字体等
* 工作空间(workspace): 保存项目
* Eclipse是以项目为单位管理的
* 开发步骤
* 创建项目
* 在src目录下创建包
* 在包中创建类
* 运算符
* 算术运算符
* `+`: 加
* `-`: 减
* `*`: 乘
* `/`: 除
* 整数相除结果仍然为整数
* 如果想要得到小数, 需要有小数参与运算
* `%`: 取余
* `++`: 自增
* `--`: 自减
* 自增和自减的注意事项
* `i++`和`++i`的区别:
* 单独使用时, 结果一样
* 参与运算时
* `i++`: 先使用i的值作为i++表达式的值, 然后i自增
* `++i`: i先自增, 然后使用自增后的值作为++i表达式的值
* 字符参与加法运算
* 在参与加法运算时, 以字符本身的值进行运算, 结果为数字
* 直接打印字符时, 输出的仍然是字符
* 字符串参与加法运算: 拼接字符串
* 赋值运算符
* `=`: 赋值
* `+=`: 拿左边和右边的值相加, 然后赋值给左边
* `-=`: 拿左边和右边的值相减, 然后赋值给左边
* `*=`: 拿左边和右边的值相乘, 然后赋值给左边
* `/=`: 拿左边和右边的值相除, 然后赋值给左边
* `%=`: 拿左边和右边的值取余, 然后赋值给左边
* 注意事项
* 扩展的赋值运算符隐含了强制类型转换
* `int i += 10;`相当于`int i = (int)(i + 10);`
* 关系运算符
* `==`: 相等
* `!=`: 不等
* `>`: 大于
* `>=`: 大于等于
* `<`: 小于
* `<=`: 小于等于
* 关系运算符的结果是boolean类型的
* 逻辑运算符
* `&`: 与. 两边都为true则为true, 否则为false
* `|`: 或. 只要有一边为true则为true, 否则false
* `^`: 异或. 男女是真爱(两边不同为true, 两边相同为false)
* `!`: 非. 取相反的值
* `&&`: 短路与. 和`&`结果一样, 但如果左边能够直接确定结果, 则右边不判断
* `||`: 短路或. 和`|`结果一样, 但如果左边能够直接确定结果, 则右边不判断
* 三元运算符
* 格式: `关系表达式? 结果为true的表达式 : 结果为false的表达式;`
* 当关系表达式为true时, 返回左边的
* 当关系表达式为false时, 返回右边的
* 注意, 三元运算符是有返回值的
* 键盘录入
* 三个步骤
* 导包: `import java.util.Scanner;`
* 导包的位置: 在package之后, class定义之前
* 创建对象: `Scanner sc = new Scanner(System.in);`
* 获取键盘输入的整数: `int i = sc.nextInt();`
s1-day03
* 流程控制语句
* 顺序结构
* 选择结构
* if语句
* else语句可以省略
* switch语句
* case穿透
* switch表达式允许的数据类型:
* byte, short, char, int
* 都是可隐式转换为int的类型, 因为byte, short, char可以隐式转换为int, 所以也可以使用
* JDK5起可以是枚举类型
* JDK7起可以是String
* 小括号中可以是常量, 也可以是变量
* case后面的值:
* 用来和表达式的值进行匹配
* 值只能是常量
* 值的类型应该和switch小括号中值的类型一致
* break: 中断
* default: 当所有case都不匹配时, 执行default
* if语句适用于有范围的场景, 或者具体值的场景
* switch语句适用于具体值场景, 不适用于范围的场景
* 循环结构
* for循环
* 适用于知道循环次数的场景
* while循环
* 适用于不知道循环次数的场景
* 至少执行0次循环体
* do...while循环
* 适用于不知道循环次数的场景
* 至少执行1次循环体
* 循环控制语句
* break
* 适用场景: switch语句, 循环
* 作用: 结束switch语句或所在循环
* continue
* 适用场景: 循环
* 作用: 结束本次循环, 继续下次循环
s1-day04
* Random类
* 作用: 生成一个随机数
* 步骤:
* 导包: `import java.util.Random;`
* 创建对象: `Random r = new Random();`
* 生成随机数: `int n = r.nextInt(10);`, 获取0到9的随机数(0到10, 包含0不包含10)
* 数组
* 一维数组
* 数组概念: 存储同一种数据类型的多个元素的容器
* 定义:
* `数据类型[] 数组名;`, **推荐**
* `数据类型 数组名[];`
* 初始化
* 动态初始化: 我们给定数组长度, 由系统给定元素的初始值
* 格式: `数据类型[] 数组名 = new 数据类型[数组长度];`
* 示例: `int[] arr = new int[3];`
* 静态初始化: 我们给定元素的初始值, 由系统给定数组长度
* 格式:
* 普通格式: `数据类型[] 数组名 = new 数据类型[]{元素1, 元素2, ...};`
* 示例: `int[] arr = new int[]{1, 2, 3};`
* 简化格式: `数据类型[] 数组名 = {元素1, 元素2, ...};`
* 示例: `int[] arr = {1,2,3};`
* 数组的长度
* 什么是长度? 数组中元素的个数
* 数组名.length: length是属性, 获取数组的长度
* 数组中元素的默认值
* int: `0`
* float, double: `0.0`
* char: `\u0000`
* boolean: `false`
* 引用类型: `null`
* 数组元素的访问
* 格式: `数组名[索引]`
* 数组的索引: 元素的编号, 从0开始
* 数组的遍历
* 什么叫做遍历: 依次获取数组中的所有元素
* 如何遍历? for循环实现
* 二维数组
* 什么是二维数组: 元素为一维数组的数组
* 定义
* `数据类型[][] 数组名;`, **推荐**
* `数据类型[] 数组名[];`
* `数据类型 数组名[][];`
* 初始化
* 动态初始化
* 格式: `数据类型[][] 数组名 = new 数据类型[二维数组的长度][一维数组的长度];`
* 示例: `int[][] arr = new int[2][3];`
* 静态初始化
* 普通格式: `数据类型[][] 数组名 = new 数据类型[][]{{元素1, 元素2,...}, {元素1, 元素2,...}, ...};`
* 示例: `int[][] arr = new int[][]{{1, 2}, {3, 4, 5}};`
* 简化格式: `数据类型[][] 数组名 = {{元素1, 元素2,...}, {元素1, 元素2,...}, ...};`
* 示例: `int[][] arr = {{1, 2}, {3, 4, 5}};`
* 访问元素:
* 格式: `数组名[二维数组的索引][一维数组的索引]`
* 二维数组的遍历: 嵌套for循环
* 数组操作常见的2个异常:
* `ArrayIndexOutOfBoundsException`: 数组索引越界异常
* 发生原因: 使用了不存在的索引
* 如何避免: 检查索引, 防止越界
* `NullPointerException`: 空指针异常
* 发生原因: 引用类型的变量保存的值为null, 然后访问了数组元素或是调用了方法或属性
* 如何避免: `if (引用类型变量 != null) {操作}`
* 数组获取最值(熟练代码书写)
* 两个数组变量指向同一个数组的操作(会画图, 会分析)
* Java内存
* 内存分区
* 栈: 存放局部变量
* 垃圾会立即回收
* 堆: 存放new出来的对象
* 垃圾要在垃圾回收器空闲时回收
* 方法区
* 本地方法区
* 寄存器
* 数组的内存分配
* `int[] arr`: 在栈中开辟内存空间
* `new int[3];`: 在堆中开辟内存空间, 并初始化元素的默认值
* `=`: 将堆内存中数组的地址值赋值给arr变量
```java
// 一维数组的遍历
int[] arr = {1, 2, 3};
for (int i = 0; i < arr.length; i++) {
syso(arr);
}
// 二维数组的遍历
int[][] arr2 = {{1, 2}, {3, 4, 5}};
for (int i = 0; i < arr2.length; i++) {
for (int j = 0; j < arr2.length; j++) {
syso(arr2[j]);
}
}
for (int i = 0; i < arr2.length; i++) {
int[] subArr = arr2;
for (int j = 0; j < subArr.length; j++) {
syso(subArr[j]);
}
}
```
* 编程思维: 数组获取最大值
* 定义一个变量max, 保存最大值, 先拿数组中的第一个元素作为参照物
* for循环遍历数组中的其他元素, 让其他元素和max依次比较
* 如果元素比max大, 则说明该元素应作为最大值, 所以将该元素存入max
* 整个for循环遍历比较结束, max保存的就是最大值
```java
// 用数组第一个元素作为临时最大值
int max = arr[0];
// 遍历数组, 获取其他元素与最大值比较
for (int i = 1; i < arr.length; i++) {
// 获取数组中的一个元素, 与max比较
if (max < arr) {
// 说明max比当前元素小, 应该将当前元素存入max
max = arr;
}
}
// 循环结束后, max就是最大值
System.out.println("数组中的最大值为:" + max);
```
* 编程思维: 数组获取最小值
* 定义一个变量min, 保存最小值, 先拿数组中的第一个元素作为参照物
* for循环遍历数组中的其他元素, 让其他元素和min依次比较
* 如果元素比min小, 则说明该元素应作为最小值, 所以将该元素存入min
* 整个for循环遍历比较结束, min保存的就是最小值
```java
// 用数组第一个元素作为临时最小值
int min = arr[0];
// 遍历数组, 获取其他元素与最小值比较
for (int i = 1; i < arr.length; i++) {
// 获取数组中的一个元素, 与max比较
if (min > arr) {
// 说明min比当前元素大, 应该将当前元素存入min
min = arr;
}
}
// 循环结束后, min就是最小值
System.out.println("数组中的最小值为:" + min);
```
s1-day05
* 方法(method, 函数function)
* 定义格式: `修饰符 返回值类型 方法名(参数类型 参数名1, 参数类型 参数名2, ...) { 方法体; return 返回值;}`
* 修饰符: 目前记住public static
* 返回值类型: 限定返回值的数据类型
* 方法名: 方法的名字, 便于调用
* 参数类型: 限定参数的数据类型以及调用方法时传入的数据类型
* 参数名(形式参数=形参): 用于接收调用方法时传入的数据
* 方法体: 完成该方法的功能
* return语句: 结束方法, 并把返回值传递给方法的调用者
* 如何调用方法:
* 直接调用: `sum(1, 2);`
* 输出调用: `System.out.println(sum(1, 2));`
* 赋值调用 : `int n = sum(1, 2);`
* 方法的重载
* 概念: Overload, 在同一个类中, 多个方法有相同的方法名, 方法参数列表不同
* 特点:
* 在同一个类中
* 方法名相同
* 方法的参数列表不同
* 参数的个数不同
* 参数的数据类型不同(包括顺序不同)
* 重载与以下几点无关
* 与方法的返回值类型无关
* 和参数的参数名无关
* 和方法体无关
* 方法的形参类型
* 方法形参是基本数据类型
* 结论: 形参的值的改变不会影响实际参数
* 为什么? 形参是定义在调用方法中的一个单独变量, 实际参数是定义在main方法中的另一个单独变量, 两者内存区域不同, 所以互不影响
* 方法形参是引用数据类型
* 结论:
* 如果形参是修改自身保存的引用, 不会影响实际参数
* 原因: 因为形参是调用方法中的一个单独变量, 实际参数是定义在main方法中的另一个单独变量, 形参改变其保存的引用指向, 并不影响实际参数的引用指向
* 如果形参是通过引用修改堆内存中保存的数据, 会影响实际参数获取的值
* 原因: 因为形参是调用方法中的一个单独变量, 实际参数是定义在main方法中的另一个单独变量, 形参通过引用修改的是堆内存中的数据, 而实际参数也是指向该堆内存中的数据, 所以形参修改后, 实际参数获取的值也会改变
```java
// 定义格式
修饰符 返回值类型 方法名(参数类型 参数名1, 参数类型 参数名2, ...) {
方法体;
return 返回值;
}
```
* 数组的操作
* 遍历
* 美化格式打印
* 求最大值最小值
* 求和
s1-day06
断点调试 分析基本数据类型 及引用数据类型 调用方法前后是否改变实参
基础语法练习
|
|