javaSE
1.java基础
java应用场景
- 嵌入式
- 安卓
- 网站后台程序
- 大数据
- 人工智能
java语言的特点
- 简单易学
- 安全
- 面向对象
- 开源
- 跨平台
跨平台
-
概念
- 如果使用java语言开发一个程序,则该程序可以在任意一个平台上使用
-
原理
- jvm是java跨平台的核心;jvm将java语言翻译成当前操作系统可以理解的指令,当前操作系统根据这些指令来完成程序的执行
运行java程序
-
编译时期
- 把 .java文件(源文件)编译为 .class 文件(字节码文件) 【检测java基本语法】
-
运行时期
- 把 .class 文件进行运行得到结果 【检测程序的执行逻辑】
main方法的作用
- 程序的入口
- 可以让单独的类进行运行
- main方法可以被jvm来调用
关键字(53个)
-
概念
- 已经被java定义了特殊含义的单词
-
特点
- 全部都是小写
-
注意
- 在开发工具中对于关键字都有特殊的标识
- goto 和 const 是特殊的关键字,也成为保留字
标识符
-
概念
- 在给类、方法、变量、接口等起名字的字符序列
-
组成规则
- 英文大小写及各国常见文字
- 数字
- 特殊符号:$ _
-
组成规范
- 见名知意
- 驼峰规则
注释
-
概念
- 解释说明程序,不会影响java程序的编译运行
-
分类
-
行注释
- // 注释一行
-
块注释
- /* */ 可以连续注释多行
-
文档注释
- /** */ 可以提取成说明文档
-
进制
-
概念
- 计数时进位的机制
-
分类
- 二进制
- 八进制
- 十进制
- 十六进制
-
进制转换
-
二进制单位
-
二进制位:bit 比特位
-
Byte:字节
- 1Byte = 8bit
-
-
计算机中数据的表现形式
- 计算机中存储数据和计算数据都是基于二进制来做的;
- 目前计算机中字符文件、图片、音频、视频等这些数据,最终都要转成二进制存储在计算机上
字面值(直接量)
-
概念
- 在程序中可以直接使用的数据
-
分类
-
数值型字面值
- 整数
- 浮点数
-
字符型字面值
- 使用一对单引号引起来的一个字符
- 单引号中不能为多个字符,也不能为空字符
- 转义字符 格式:\字符
-
字符串字面值
- 使用一对双引号引起来
- 双引号中可以是一个字符,也可以是多个字符或者空字符
-
布尔值字面值
- 布尔:判断逻辑结果
- true:对的,正确的
- false:错误的
-
引用
-
概念
- 可以通过一个名字来指向一个具体的数据值
-
格式
- 数据类型 引用名 = 初始化值;
-
分类
-
变量
- 引用可以发生变化的量
- 可以存储单个数据的容器
- 数据类型 变量名 = 初始化值;
-
常量
- 引用不可以发生变化的量
- final 数据类型 常量名 = 初始化值;
-
数据类型
-
分类
-
基本数据类型
-
整型
-
byte
- 1字节
-
short
- 2字节
-
int
- 4字节
-
long
- 8字节
-
-
浮点型
-
float
- 4字节
-
double
- 8字节
-
-
字符型
-
char
- 2字节
-
-
布尔型
-
boolean
- 1字节
-
-
-
引用数据类型
- 数组
- 类
- 接口
- …
-
数据类型转换问题
-
分类
-
自动数据类型转换
- 小转大:byte->short->int->long—>float—>double char->int->long—>float—>double
-
强制数据类型转化
- 大转小
-
-
注意
- 整型转浮点型,直接在整数后面补 .0
- 字符型转整型,会根据码表对应的ASCLL值转换为int型
- 浮点型转整型,小数部分直接舍去,存在精度损失
- 布尔型无法通过强制数据类型转换
- 当大的数据类型的值超过小的数据类型的范围时,从最低位开始拿对应位数的二进制
-
-
运算符
-
概念
- java中内置的表示特定运算规则的符号
-
分类
-
算术运算符
-
-
-
- / % ++ –
-
-
-
-
赋值运算符
- = += -= *= /= %=
-
关系运算符
-
< >= <= == !=
-
-
逻辑运算符
- & | ! ^ && ||
-
三目运算符
- 表达式?表达式1:表达式2
-
位运算符
- & | ~ ^ << >> >>>
-
流程控制语句
-
概念
- 控制程序执行的语句
-
分类
-
顺序结构
- 最基本的从上到下,从左到右的常用结构
-
分支结构
- if判断语句、switch case选择语句
-
循环结构
- for循环、while循环、do while循环
-
跳转控制语句
-
break
- 在switch语句中出现,用于结束语句,在循环中用于结束当前循环
-
continue
- 在循环中跳过当次循环
-
return
- 返回一个值
数组
-
概念
- 存储多个相同类型的数据元素的容器
-
定义格式
- 数据类型[] 数组名 = new 数据类型[元素个数/数组长度]
- 数据类型[] 数组名 = new 数据类型[]{元素值1,元素值2,……}
- 数据类型[] 数组名 = {元素值1,元素值2,……}
-
数组应用
-
遍历—依次输出数组元素
-
最值—数组元素的最大值/最小值
-
查找—给定查找数返回在数组中第一次出现的下标值
-
排序—数组元素进行排序
- 冒泡排序
- 选择排序
-
扩容—数组定义完成之后长度无法改变—数组之间的复制
-
-
二维数组
-
概念
- 存储一维数组的数组
-
定义格式
- 数据类型[][] 数组名 = new 数据类型[二维数组长度/一维数组个数][每一个一维数组长度]
- 数据类型[][] 数组名 = new 数据类型[二维数组长度/一维数组个数][]
- 数据类型[][] 数组名 = {{元素值1,元素值2,……},{{元素值1,元素值2,……},……}
-
java内存
-
栈
- 存储变量,当存储内容使用完毕时立即清除,不会给存储的内容赋予系统默认初始值
-
堆
- 存储对象,当对象不再使用时会等某个时刻系统来进行回收,会对存储的内容赋予系统默认初始值
-
方法区
-
本地方法栈
-
寄存器
方法
-
概念
- 把重复有效的代码进行抽取,抽取的形式就叫方法
-
书写格式
- 修饰符 返回值类型 方法名(参数列表){
方法体;
return 返回值;
}
- 修饰符 返回值类型 方法名(参数列表){
-
返回值类型
- 给定对应返回值类型来接受返回值,如果没有返回值用void表示
-
方法名
- 标识符
-
参数列表
- 由参数类型、参数个数、以及参数顺序来决定的
-
方法体
- 重复且有效的代码
-
return
- 把方法的方法返回值进行返回
-
注意
- 方法只有被调用才执行
- 两个明确:方法返回值类型、参数列表
- return两个功能:结束方法;把返回值进行返回
- 考虑参数所有取值情况都要提供对应的返回值情况
-
重载方法
-
概念
- 当一个类中,方法名一直,参数列表不一致的方法
-
调用重载方法时
- 如果提供精确匹配方法就进行精确匹配
- 如果没有提供精确匹配方法进行相对精确匹配
- 如果提供多个精确匹配方法无法调用到具体的方法就会报错
- 尽量提供精确匹配方法
-
-
方法传值
- 当实参是基本数据类型时,传递就是值得拷贝
- 当实参是引用数据类型时,传递就是地址值的拷贝
2.面向对象
面向对象引入
-
概念
- 面向对象本质是一个编程范式(思考方式)
- 面向过程:关注每一步代码实现的细节
- 面向对象:先把代码的实现细节整合到对象上,只要找对对象就能获取对象身上所有的功能
-
类与对象直接的关系
- 针对一类对象进行抽取,把共有的特征抽取成了属性,把共有的行为抽取成了方法,把这一类对象抽取成了类。
- 类就是对对象的概况
- 对象就是类的具体实现
-
构造方法
- 与类同名,没有方法返回值类型
- 用来构建对象
- 有参构造,给对象属性进行初始化
- 支持重载
- 当类中没有定义任何形式的构造方法时,底层jvm就会默认添加无参构造。当类中定义了构造方法,底层就不会再提供无参构造
- 类中至少含有一个构造方法
-
java中所有的非静态属性和非静态方法都要通过对象来调用
-
this
- 关键字,代表当前类正在活动的对象
- this(),this语句用于在同一个类中的构造方法里调用别的构造方法,要在首行使用
-
构造代码块
- 方法外内类定义{}
- 用于初始化属性
- 优先于任何形式的构造方法先执行
-
局部代码块
- 方法内定义{}
- 可以控制变量的生命周期,提高内存的利用率
-
成员变量与局部变量的区别
-
位置
- 成员变量:方法外类内
- 局部变量:方法内/代码块内
-
使用范围
- 成员变量:整个类
- 局部变量:整个方法/代码块
-
内存
- 成员变量:堆内存
- 局部变量:栈内存
-
生命周期
- 成员变量:随着类的对象的创建而产生,随着对象的回收而消失
- 局部变量:随着方法的调用/代码块的执行而出现,随着方法调用完毕/代码块执行完毕而消失
-
面向对象的特征
-
封装
- 体现形式—方法、属性私有化,提供公共的访问方式来保证可以进行正常的取值和赋值,提高数据的安全性
-
继承
-
概念
- 当对个类中出现的重复的内容,把重复的内容方法新的类中,通过extends关键字让原来的类和新类产生的关联关系。
- 原来的类称之为子类/派生类,新的类称之为父类/超类
- 子类可以获取父类的部分信息
- 【子类继承不了父类的私有化信息,构造方法以及构造代码块】
-
继承方式
- 类与类之间支持单继承
-
重写(覆盖)
- 当父子类中出现方法签名一致的方法
-
重写的原则(两等两小一大)
- 当父类的方法返回值类型是基本数据类型/void时,子类的方法返回值类型要和父类一致
- 当父类的方法返回值类型是引用数据类型,子类的方法返回值类型要么和父类的方法返回值类型一致,要么是父类方法返回值类型的子类
- 子类方法不能抛出比父类更大范围的编译时异常
- 子类的方法访问权限修饰符要么和父类一致,要么比父类的方法访问权限修饰符大
-
super
- 关键字,代表父类对象可以调用信息
- super()—super语句,在子类构造方法里调用父类的构造方法,使用时要在首行
- 每个子类构造方法里默认还有super无参语句来调用父类的无参构造,当父类没有提供无参构造,子类所有的构造方法需要手动添加super语句去调用父类对应形式的有参构造
- 保证父类对象优先于子类对象先存在
- 父子类执行顺序:父类构造代码块–>父类构造方法–>子类构造代码块–>子类构造方法
-
-
多态
-
概念
-
在代码操作过程中呈现的多种形式
-
编译时多态—在编译时期绑定代码
- 体现形式—重载
-
运行时多态—在运行时期绑定代码
- 体现形式—重写、向上造型
-
-
向上造型
- 对象可以调用哪些方法看父类,具体方法执行看子类是否有重写
-
解释重写原则
-
优点
- 统一参数类型
- 解耦(降低耦合度)
-
static(静态)
-
关键字,修饰符
-
静态变量
- 随着类的加载(方法区的静态常量池)而加载到静态区,与类同级,也叫类变量。
- 可以通过类名.的形式来直接调用,也可以通过对象调用
- 静态区会给静态变量赋予系统默认初始值
- 类创建的所有对象都共享同一个静态变量
-
静态方法
- 随着类的加载而加载到静态区,与类同级,也叫类方法
- 可以通过类名.的形式来直接调用,也可以通过对象调用
- 静态区不会给静态方法赋予系统默认初始值
- 当main方法被调用会加载到栈中执行
-
静态代码块
- static修饰的构造代码块
- 给静态属性进行初始化
- 静态代码块随着类的加载而加载一次(类只加载一次)
- static修饰的信息都只加载一次
- 父子类执行顺序—类级别(先父后子),对象级别(先父后子)
-
java中所有的静态信息只能直接使用静态信息,所有的非静态信息可以直接使用静态信息以及非静态信息
-
总结
-
静态方法里不可以定义静态变量
- 静态方法只有被调用时才加载到栈中执行,里面的内容才能出现,但静态变量与类同级
-
静态方法可以重载
-
静态方法不可以重写
- 重写与对象同级,静态方法与类同级,静态方法没有重写。
- java中允许父子类中出现方法签名一致的两个静态方法(没有重写)以及两个非静态方法(有重写)
-
final(最终)
-
关键字,修饰符
-
最终值
- 当final修饰基本数据类型时是值不能发生改变
- 当final修饰引用数据类型时是地址值无法改变
- 当final修饰成员变量时保证对象创建完成之前给值
- 当final修饰静态变量(静态常量)时保证类加载完之前给值
-
最终方法
- 支持重载但不支持重写
-
最终类
- 不能有子类但是可以有父类
abstract(抽象)
-
概念
- 当所有子类对父类某个方法都进行不同程度的重写,那么此时方法里的方法体没有任何意义,所以可以把方法体去掉再加上abstract来修饰变成抽象方法,抽象方法所在的类需要变成抽象类
- 抽象方法一定要被重写(为了避免调用到抽象方法)
- 当普通类继承抽象类需要重写所有的抽象方法,如果不想重写所有的抽象方法,可以把普通类变成抽象类
-
注意
- abstract是关键字,修饰符 方法、类
- 抽象类中不一定含有抽象方法,但是抽象方法所在的类一定是抽象类
- 抽象类里可以定义属性和方法
- 抽象类里可以定义构造方法,给属性进行初始化
- 抽象类不能创建对象,没有对象
- private/final/static三种修饰符都没有重写,所以不能修饰抽象方法
- 宗旨就是延展类的继承结构
interface(接口)
-
概念
- 当抽象类中所有的方法都是抽象方法,那么就可以把抽象类转成接口使用
- 接口本质不是类
- 通过implements让类与接口直接产生关联关系—实现
- 支持类与接口之间多实现,支持接口与接口之间是多继承
-
注意
- 实现类需要重写接口中所有的抽象方法,如果不想重写所有的抽象方法需要把类变成抽象类
- 接口中所有的方法都是抽象方法(和版本有关系)
- 接口不可以定义构造方法
- 接口不可以创建对象
- 接口可以定义属性并且默认被public static final共同修饰
- 接口中的抽象方法默认被public abstract 共同修饰
- 接口声明对象在编译期间可以接受所有类型对象的赋值,运行期间会检测类是否是接口的实现类
- 宗旨是为了给实现类注入更多的功能
-
优点
- 模板
- 约束
接口与抽象类的区别
- 接口不是类
- 接口里的方法都是抽象方法
- 接口支持多实现多继承
- 接口里不能定义构造方法
- 接口里的属性默认被public static final共同修饰
- 抽象类的目的是为了延展类继承结构,接口是为了注入更多的特性
内部类
-
概念
- 类/接口中再次定义类
-
类里再次定义类
-
方法内部类
- 在方法内定义类
- 可以定义所有的非静态信息以及静态常量
- 可以进行正常的继承和实现
- 不能被访问权限修饰符来修饰,可以被final以及abstract修饰
- 可以获取外部类所有信息
- 只能获取本方法里的常量信息
-
成员内部类
- 在成员位置定义类
- 可以定义所有的非静态信息以及静态常量
- 可以进行正常的继承和实现
- 可以被访问权限修饰符以及abstract和final来修饰
- 可以获取外部类所有信息
-
静态内部类
- 在成员位置定义被static修饰的类
- 可以定义所有的非静态信息以及静态常量
- 可以进行正常的继承和实现
- 能被访问权限修饰符以及abstract和final修饰
- 只能获取外部类的静态信息
-
匿名内部类
- 默认继承类/默认实现接口,重写抽象方法
- 可以被继承的类或者接口具有匿名内部类形式
- 只能使用一次
- 使用场景—当参数传递
-
-
接口里定义类以及内部接口都是被static默认修饰
包
-
用法
- package 声明包 声明当前类所在的位置 在首行且只能出现一次
- import 导入包 把不在当前包位置的类导进来,不在首行且可以多次出现
-
提供包
-
Java(提供源生包)
-
lang包
- 当程序启动时会自动加载lang包下(核心类库)的内容,使用时不需要导包
-
util包
- 工具包,提供大量可以操作对象和类的信息
-
io包
- 数据传输
-
math包
- 提供简单的数学运算
-
net包
- 网络编程
-
nio包
- 高并发
-
sql包
- 操作数据库
-
time包
- 提供时间和日期
-
-
Javax(提供扩展包)
-
Org(第三方厂商 Apache)
-
3.API
XMind - Trial Version