黑马程序员技术交流社区
标题:
【石家庄校区】经典基础知识总结
[打印本页]
作者:
syc123
时间:
2017-11-30 01:21
标题:
【石家庄校区】经典基础知识总结
本帖最后由 小石姐姐 于 2017-12-7 14:55 编辑
day1
ava语言平台版本:
JavaSE: Standard Edition标准版本. 开发桌面软件
JavaME: Micro Edition嵌入式版本. 开发机顶盒, 手机等嵌入式设备的程序
JavaEE: Enterprise Edition企业版本. 开发服务器程序
JVM:
Java Virtual Machine, Java虚拟机. Java实现的虚拟的计算机, 在不同的操作系统中模拟出相同的运行环境
JRE:
Java Runtime Environment, Java运行时环境.
包括JVM和Java核心类库
是运行Java程序的最小环境
JDK:
Java Development Kit, Java开发工具包
包括JRE和Java开发工具(javac等)
JVM, JRE, JDK的关系:
JVM < JRE < JDKc
Dos命令
打开控制台:
win + r, 输出cmd, 回车
常用DOS命令
切换盘符: 盘:, 如切换到d盘d:
列出当前目录下的文件和目录: dir (dir = directory)
查看指定目录下的文件和目录: dir 目录名
切换目录: cd 目录名 (cd = change directory)
目录以\作为级别分隔
切换到上一级目录: cd ..
当前目录: .
切换到当前目录下的a目录: cd .\a, cd a
切换多个目录: cd a\b\c
清空屏幕: cls (clear screen)
退出控制台: exit
上 下箭头:
注释的概述和分类
注释:
用于解释说明程序的文字, 相当于备注, 只是为了帮助程序员理解代码或者做说明, 并不是代码
注释的种类:
单行注释: // 注释内容
多行注释: /* 注释内容 */
文档注释: /** 文档注释内容 */, 用于生成文档
注意: 多行注释, 文档注释都不能嵌套使用
常量:
概念: 在程序的执行过程中, 其值不可以发生改变的量
分类:
字符串常量: "hello"
字符常量: 'a'
整数常量: 12
小数常量: 12.23
布尔常量: true, false
空常量: null
数据类型分类和数据大小
8种基本数据类型(4类8种)
整数
byte:
1字节(2^8)
范围: -128 ~ 127
short:
2字节(2^16)
范围: -32768 ~ 32767
int:
4字节(2^32)
范围: -2147483648 ~ 2147483647
long:
8字节(2^64)
范围: -9223372036854775808 ~ 9223372036854775807
浮点数
float: 单精度
4字节
范围: -3,40292347E+38 ~ +3,40292347E+38
double: 双精度
8字节
范围: -1.79769313486231576E+308 ~ 1.79769313486231576E+308
字符
char: 2字节, 范围 -128 ~ 127
布尔
boolean: 1字节, 范围 true/false
3种引用数据类型
数组
类
接口
标识符
概念: 用于给 包, 类, 方法, 变量 等起名字的符号
组成规则:
unicode字符:
数字 (注意不能以数字开头)
大小写英文字母
汉字 (不建议使用)
下划线: _
美元符号: $
标识符的常见命名规则
基本要求:
见名知意, 看到就明白是什么意思
包名的要求:
什么是包: 文件夹, 用于对类进行分类管理
全部小写, 多级包用点隔开: com.itheima.haha
类名的要求:
每个单词的首字母都要大写: Demo, HelloWorld
方法名的要求
第一个单词字母全小写, 从第二个单词开始首字母大写: main(), eat(), eatMeat()
变量名的要求
第一个单词字母全小写, 从第二个单词开始首字母大写: age, yourAge
变量定义的注意事项
变量定义时的注意事项
变量未赋值时不能使用
变量只在它声明时所属的范围内有效(所在的大括号)
一行上可以定义多个变量, 但是不建议这样做
类型转换:
一种数据类型转换为另一种类型
类型转换的种类:
隐式转换(自动转换)
类型按照容量由小到大可以进行类型转换
转换规则: byte, short, char --> int --> long --> float --> double
强制转换
不考虑类型的大小关系, 强制进行类型转换, 可能会引发问题
day2
算符
算术运算符
+: 加
-: 减
*: 乘
/: 除
整数相除结果仍然为整数
如果想要得到小数, 需要有小数参与运算
%: 取余
++: 自增
--: 自减
增和自减的注意事项
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类的对象: Scanner sc = new Scanner(System.in);
调 用方法获取输入的整数: int i = sc.nextInt();
day3
流程控制语句
顺序结构
选择结构
if语句
else语句可以省略
switch语句
case穿透
switch表达式允许的数据类型:
byte, short, char, int
都是可隐式转换为int的类型, 因为byte, short, char可以隐式转换为int, 所以也可以使用
JDK5起可以是枚举类型
JDK7起可以是String
小括号中可以是常量, 也可以是变量
用来和表达式的值进行匹配
值只能是常量
值的类型应该和switch小括号中值的类型一致
break: 中断
default: 当所有case都不匹配时, 执行default
if语句适用于有范围的场景, 或者具体值的场景
switch语句适用于具体值场景, 不适用于范围的场景
循环结构
for循环
适用于知道循环次数的场景
while循环
适用于不知道循环次数的场景
至少执行0次循环体
do...while循环
适 用于不知道循环次数的场景
至少执行1次循环体case后面的值:
循环控制语句
break
适用场景: switch语句, 循环
作用: 结束switch语句或所在循环
continue
适用场景: 循环
作用: 结束本次循环, 继续下次循环
day4
Random类: 用于生成随机数的类
使用步骤:
导包: import java.util.Random;
创建Random类的对象: Random r = new Random();
使用对象调用方法获取随机数: int number = r.nextInt(10);
nextInt(y)表示产生的数据在0到y之间, 包括0, 但不包括y
数组:
存储同一种数据类型的多个元素的容器
2种定义格式(区别在于中括号的位置不同):
数据类型[] 数组名;
推荐使用这种格式
示例: int[] arr;
数据类型 数组名[];
示例: int arr[];
初始化
为数组开辟内存空间, 并为数组中的每一个元素赋一个初始值
2种初始化:
动态初始化: 我们给出数组长度, 由系统给出元素的默认值
静态初始化: 我们给出初始化值, 由系统给出数组长度
数组的元素: 数组中的单个数据
数组的索引: 元素在数组中的位置序号, 从0开始
角标
访问数组的元素: 数组名[索引];
Java中的内存分配
栈: 存储局部变量
堆: 存储new出来的实体(对象)
方法区: 存储加载的类, 面向对象进阶讲解
本地方法区: 和系统相关
寄存器: 给CPU使用
局部变量
定义在方法中的变量
堆的特点:
每一个对象都有地址值
每一个对象的数据都有默认值
使用完毕后会在垃圾回收器空闲的时候被垃圾回收器回收内存
栈的特点:数组的静态初始化
数组的静态初始化:
我们给出初始化值, 由系统给出数组长度
静态初始化方式创建数组, 数组最开始也有默认值0, 但立刻就被静态初始化值覆盖了
静态初始化2种格式:
先进后出
使用完毕后立即回收内存
操作数组的2个常见异常:
ArrayIndexOutOfBoundsException: 数组索引越界异常
发生原因: 我们访问了不存在的索引
如何避免: 不要访问不存在的索引
NullPointerException: 空指针异常
发生原因: 数组名为null时使用数组名
如何避免: 判断数组是否为null, 如果不是null, 再操作: if(arr != null) { 操作 }
null只能赋值给引用数据类型的变量, 包括数组, 类, 接口
数组操作之遍历数组
数组遍历:
依次获取数组中的每一个元素
一般使用for循环
获取数组的长度:
使 用数组的length属性, int length = arr.length;
数组操作之获取最值
最值
最小值和最大值
编程思维: 数组获取最大值
定义一个变量max, 保存最大值, 先拿数组中的第一个元素作为参照物
for循环遍历数组中的其他元素, 让其他元素和max依次比较
如果元素比max大, 则说明该元素应作为最大值, 所以将该元素存入max
整个for循环遍历比较结束, max保存的就是最大值
编程思维: 数组获取最小值
定义一个变量min, 保存最小值, 先拿数组中的第一个元素作为参照物
for循环遍历数组中的其他元素, 让其他元素和min依次比较
如果元素比min小, 则说明该元素应作为最小值, 所以将该元素存入min
整个for循环遍历比较结束, min保存的就是最小值
二维数组:
概念: 二维数组是元素为一维数组的数组
定义格式:
格式1(推荐): 数据类型[][] 数组名;
格式2: 数据类型 数组名[][];
格式3: 数据类型[] 数组名[];
初始化格式
动态初始化: 数据类型[][] 数组名 = new 数据类型[m][n];
m: 二维数组中一维数组的个数(二维数组的长度)
n: 一位数组中的元素个数(二维数组中一维数组的长度)
静态初始化:
标准格式: 数据类型[][] 数组名 = new 数据类型[][]{{...}, {...}, {...}, ...};
简化格式: 数据类型[][] 数组名 = {{...}, {...}, {...}, ...};
两种初始化的区别:
动态初始化, 二维数组中的一维数组的长度是固定的, 因为n已经确定
静态初始化, 二维数组中的一位数组长度可以是不同的
注意:
int[][] arr = new int[3][];不给一维数组长度是正确的
含义: 创建了一个长度为3的二维数组, 而不创建内部的一维数组. 而动态初始化是需要给元素默认值的, 二维数组中的一维数组是引用类型, 所以是默认值null. 即创建完的数组为[null, null, null]
如果不给二维数组长度则是错误的, 因为虚拟机无法知道要如何创建该数组
获取二维数组中某个一维数组的某个元素值:
arr[二维数组索引][一维数组索引]
day5
方法定义格式
方法:
完成特定功能的代码块
作用
提高代码复用性和可维护性
定义格式:
修饰符: 目前记住public static
返回值类型: 用于限定返回值的数据类型
方法名: 方法的名字, 便于我们调用
参数类型: 用于限定调用方法时传入数据的类型
参数名: 用于接收调用方法时传入数据的变量
用于告诉方法的调用者, 调用该方法时需要传入何种数据
方法体: 完成我们需要的功能的代码
return语句: 结束方法, 并把返回值传递给调用者
求和方法的调用
调用方法的3种格式
单独调用: sum(10, 20);
输出调用: System.out.println(sum(10, 20));
赋值调用: int result = sum(10, 20);
注意:
所有定义的方法都需要被调用才能执行, 包括main()方法, main()方法由虚拟机调用
方法重载的概述和基本使用
方法的重载:
英文Overload
概念: 在同一个类中, 有多个方法名相同, 参数列表不同的方法
方法重载的特点:
在同一个类中
方法名相同
参数列表不同
参数个数不同
参数的数据类型不同(包括数据类型相同但参数列表的顺序不同)
方法重载和什么无关?
和返回值类型无关
和参数的变量名无关
和方法体无关
方法的形参类型
方法形参是基本数据类型
结论: 形参的值的改变不会影响实际参数
为什么? 形参是定义在调用方法中的一个单独变量, 实际参数是定义在main方法中的另一个单独变量, 两者内存区域不同, 所以互不影响
方法形参是引用数据类型
结论:
如果形参是修改自身保存的引用, 不会影响实际参数
原因: 因为形参是调用方法中的一个单独变量, 实际参数是定义在main方法中的另一个单独变量, 形参改变其保存的引用指向, 并不影响实际参数的引用指向
如果形参是通过引用修改堆内存中保存的数据, 会影响实际参数获取的值
原因: 因为形参是调用方法中的一个单独变量, 实际参数是定义在main方法中的另一个单独变量, 形参通过引用修改的是堆内存中的数据, 而实际参数也是指向该堆内存中的数据, 所以形参修改后, 实际参数获取的值也会改变
day6
断点:
breakpoint, 标记程序在这里暂停
断点调试的作用:
可以在程序运行中查看程序的执行流程
调试程序, 如查看变量的值
如何加断点
:
在行号左边双击
创建/取消断点
单个断点: 双击
多个断点: 在debug视图中的breakpoints窗口中点击Remove all breakpoints按钮
执行debug:
右键 - debug as
数组元素反转
反转: reverse
分析
定义数组
Scanner输入数组元素
实现反转
首尾元素交换
开头索引++, 结尾索引--
引 入第三方变量交换
注意界限
数组基本查找
查找元素第一次出现的索引
分析
Scanner录入数组数据
实现查找方法
遍历数组, 依次比较元素, 如果相等, 就把该处索引返回
异常情况处理
查不到返回-1
数据加密
分析
将录入密码存入数组
进行加密处理
每位数字都加上5, 然后除以10的余数, 来替代该数字
再将第一位和第四位交换, 第二位和第三位交换
作者:
Port
时间:
2017-11-30 15:48
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2