目录
1、java开发环境搭建
1.1、JDK、JRE、JVM
- JDK:java的软件开发工具包,包括了JRE和JVM。
- JRE:java程序运行环境的集合,包括了jvm。含有java的核心类库
- JVM:java虚拟机,java程序跨平台的实现就是靠JVM实现的,通过在不同操作系统中安装不同的JVM可以使得同一份代码程序在不同的操作系统上运行,且编译好的程序移到别到操作系统上可以直接运行,无需重新编译。
1.2、环境变量
-
没有配置环境变量是没有办法在dos窗口的任意路径下运行javac.exe和java.exe程序的,也就编译和运行java程序
-
dos窗口在当前目录下找不到javac.exe和java.exe程序则根据环境变量配置的路径寻找
-
只要配置环境变量,dos窗口中的任何路径下都能够编译和运行java程序
-
CLASSPARTH环境变量属于Java语言,专门给类加载器指路的,寻找class文件。“.”表示当前目录下,若配置该环境变量应当将“.”加上
1.3、GC机制
- 自动垃圾回收机制
- java会启动一个单独的垃圾回收线程,时刻监视内存情况
2、标识符与关键字
2.1、标识符
- 标识符命名格则
- 类名、接口名、方法、语句块、变量、常量 都是标识符
- 标识符由字母、数字、下划线、美元符号组成,不能以数字开头
- 区分大小写,不能使用保留字和关键字做标识符
- 标识符命名规范(约定并非规则,不遵守程序也没问题)
- 类、接口:每个单词首字母大写
- 方法、变量:首字母小写,后面每个单词首字母大写
- 常量:每个字母大写,单词之间用下划线分割
2.2、关键字
- java的关键字对java的编译有特殊意义
byte | short | int | long | float |
---|---|---|---|---|
double | boolean | char | if | for |
else | while | do | continue | break |
public | default | protected | private | throw |
throws | try | catch | final | finally |
case | switch | transient | package | new |
static | this | abstract | strictfp | nativ |
goto | super | extends | implements | import |
instanceof | return | synchronized | void | const |
class | enum | assert | interface | volatile |
公开类的类名需和文件名一致
3、变量
- 变量是内存当中的一块空间,这块空间有名字、类型和数据(变量名、数据类型和存储数据)
- 不同的数据类型会分配不同大小的内存
- 局部变量
- 只在方法体中有效
- 方法开始执行时会为其分配内存,结束的时候就会释放内存
- 成员变量
- 实例变量
- 实例化的变量,每个对象的实例变量所在的内存位置不同
- 在对象创建的时候会给实例变量赋值,若没指定特定值,先默认赋值0、null、false…
- 静态变量:类加载的时候初始化,存储在方法区内存中,只有一份内存空间
- 实例变量
4、数据类型
4.1、基本数据类型
数据类型 | 内存大小 |
---|---|
byte | 1一个字节 [-27 ~ 27-1] |
short | 2个字节 [-215 ~ 215-1] |
int | 4个字节 [-231 ~ 231-1] |
long | 8个字节 [-263 ~ 263-1] |
float | 4个字节 [-231 ~ 231-1] |
double | 8个字节 [-263 ~ 263-1] |
char | 2个字节 [0 ~ 216-1] |
boolean | 1个字节 [true、false] |
4.2、BigDecimal类
- 精度超高,适合财务数据的存储
4.3、基本数据类型转换
- 自动类型转换
- 小容量会自动向大容量数据类型转换
- 强制类型转换
- 大容量向小容量进行数据类型转换需要使用强制类型转换
- 强制类型转换有可能损失精度,所以需要手动添加强制类型转换符
- 整数型字面量会被当作int类型处理
- 要给long类型复制时需要使用(数字后面添加L),若字面量大于整形一定要添加(L)
- 需要赋值为float类型时使用(F)
- 当整数字面量没有超过byte、short、char的取值范围时,可直接赋值
- 除boolean类型外的基本数据类型都可以进行类型转换
- cahr没有负数,所以可以取得的更大的整数
- byte、short、char在运算时会转成int类型进行运算
- 多种数据类型进行混合运算时,各自会转成容量最大的那一种类型
5、控制语句
- case穿透现象:匹配的分支中没有使用break,会直接进入下一个分支执行(不再匹配),直到遇到break或所有分支执行完毕
- do…while()语句先执行后判断,用于需要先执行一次再进行循环的程序
- default可以写在switch中的任何位置,只有其他分支都没匹配上才会执行
6、方法
6.1、方法重载
- 在同一类体中,具有相同的方法名,不同的参数列表的多个方法
- 参数个数不同
- 参数类型不同
- 参数顺序不同
6.2、方法重写(方法覆盖)
- 具有父子继承关系之间
- 具有相同的返回值
- 具有相同的方法名
- 具有相同的参数列表
- 不能继承的方法无法覆盖,如父类的私有方法,构造方法
- 不能比父类中的方法的访问权限更低
- 不能比父类中的方法抛出更宽泛的异常
- 静态方法没有覆盖的必要,方法覆盖能满足多态机制,但静态方法实现不了多态
7、面向对象
7.1、面向对象的理解
- 面向对象将对象当作程序的基本单元
- 面向对象将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性
- OOA:面向对象分析
- OOD:面向对象设计
- OOP:面向对象编程
- 耦合性低、易维护
- 类是一个模板,描述了一类对象的行为和动作
- 对象是类的一个实体,具有具体的状态和行为
7.2、对象的创建
- 通过构造方法完成对象的创建
- 对象创建后存储在堆内存中
- 创建对象时,实例变量会先进行赋值操作,没有给定特定值就会赋默认值(0、null、false…)
7.3、内存分配及各区域存储的内容
- 栈
- 被调用的方法
- 局部变量
- 方法区
- 类信息
- 常量
- 静态代码块
- 字符串
- -128~127
- 堆
- 对象
8、封装
- 隐藏内部结构,对外提供接口供其访问
- 封装后形成独立实体,能在不同环境中被重复调用
- 降低耦合度、提高扩展性,增加代码的复用性
- 进行安全控制,保障内部数据的安全
9、继承
- 避免代码的重复,增加代码的复用性,且易于维护
- 构造方法和私有方法无法被继承
- 父类发生改变会对子类产生影响,耦合度高
10、多态
-
向上转型➡子类型转换成父类型,自动类型转换
-
向下转型➡父类型转换成子类型,强制类型转换
-
向上转型和向下转型,两种类型必须有继承关系
-
向下转型前需要使用instanceof进行判断
-
同一个方法作用在不同对象(不同类的对象)上
-
开闭原则OCP,可复用设计,软件实体对扩展开放,对修改关闭
-
降低耦合性,增强程序的可扩展性
-
(静态绑定)编译阶段,绑定的是父类的方法
-
(动态绑定)运行阶段,执行的是子类中的方法
11、this、super和static
11.1、this
- 保存的是当前对象的内存地址
- this有对象的概念,所以不能在静态方法中直接使用
- this()只能出现在构造方法中的第一行
11.2、super
- super不是一个引用,无法直接使用,例如直接打印super
- super代表了当前对象中从父类继承过来的那部分特征
- 使用this和super访问属性时访问的是同一块内存
- super()只能出现在构造方法的第一行,没有写this()和super()时默认调用super()
- 创建对象时,object类的构造方法必定执行
- 给子类对象初始化父类型特征,代码复用
- 若子类和父类都有一个同名的实例变量或实例方法,需要使用super调用父类型的实例变量才能使用这个变量
11.3、static
- 用来修饰方法、变量和代码块
- 静态变量在类加载的时候初始化
- 静态代码块在类加载时执行,只执行一次
- 将类中某个全部对象保存的数据都相同的属性改成静态变量,可以减少内存的浪费
- 静态变量和静态方法可以使用引用的方式访问,且引用保存为null时也能正常调用,但不建议这样使用
- 在类加载的时候,静态变量和静态代码块的优先级相同,即只和它们所处的位置先后有关