一、java特点
- 解释性语言
- 平台无关
- 自动内存管理
- 参数值传递
- 自动垃圾回收
- 单继承
平台无关性实现方式
- Java虚拟机(JVM)
- Java 代码编译后生成的字节码文件(.class文件)可以在任何安装了JVM的操作系统上运行
- JVM 负责将字节码解释或编译成本地机器码,从而在特定平台上执行
- 标准库和API
- Java 提供了丰富的标准库,这些库封装了与操作系统无关的功能,开发者可以使用这些库而不需要关心底层操作系统的差异
- Java API 也是跨平台设计的,确保了相同的代码在不同平台上具有相同的行为
- 编译器和字节码:
- Java 编译器(javac)将源代码编译成平台无关的字节码,这些字节码在JVM中运行
- 字节码是一种中间语言,它既不是源代码也不是机器码,因此可以在任何安装了JVM的平台上解释执行
- 抽象层:
- Java 通过提供抽象层来隐藏底层平台的差异。比如,Java 的文件I/O操作通过 java.io 包提供,网络操作通过 java.net 包提供,这些包在不同平台上有相同的接口。
垃圾回收算法
- 标记清除
- JVM识别并清除,导致内存空间不连续(内碎片)但是快
- 标记复制
- 空间分两半,一开始在左边(假设),复制存活对象到右边,清空左侧的垃圾,再来的对象在右侧。
- 无内碎片,浪费一半空间,复制慢
- 标记整理
不支持多继承
- 多继承会导致菱形继承:B、C都继承了A,然后D继承了B、C,则D会有两份来自A的属性与方法(产生歧义)
- 所以不支持多继承,可以多实现implements(需要重写@Override)
二、面向对象 vs 面向过程
- 面向对象
- 属性、行为封装为对象
- 从问题中抽象出对象,通过对象间的调用解决问题
- 面向过程
面向对象三大基本特征
- 封装:客观事物抽象为java类,类中有属性、方法
- 继承:子类继承父类,为了复用(单继承,多实现)
- 多态:重写使子类和父类在同一个方法中有不同含义
重载 vs 重写
- 重载:方法名称相同,参数不同
- 重写:方法名称相同、参数也相同@Override
面向对象五大基本原则
- 单一职责:一个类只做一件事
- 开放封闭:对扩展开放,对修改封闭(implements)
- 里氏替换:子类必须能替换其基类
- 依赖倒置:程序依赖抽象接口,而不是具体的实现
- 接口隔离:多个小而专(专门)的接口,而不是大的总接口
三、接口 vs 抽象类
- 都可以实现抽象层
- 接口
- 只有抽象方法,只定义方法,无实现,修饰符public
- 若定义了成员变量,必须初始化
- 无构造器
- 被实现
- 制定规范
- 抽象类
- 修饰符public、protected、private、default
- 可以有构造器
- 被继承
- 复用
四、包装类
- 布尔型
- 基本数据类型:boolean - 包装类:Boolean
- 整型
- byte - Byte 1字节 -128 ~ 127
- short - Short 2字节
- int - Integer 4字节
- long - Long 8字节
- 字符型
- 浮点型
- float - Float 4字节
- double - Double 8字节
- 包装类使基本数据类型有了对象的性质,并为其添加了属性和方法
- 默认值不同
- 基本数据类型:0,false,\u0000
- 包装类:null
- 初始化方式不同
- 存储方式不同
- 自动拆装箱
- 基本数据类型 to 包装类:装箱,反之拆箱
- 基本数据类型放入集合类
- 包装类和基本类比大小
- 包装类运算
- 三目运算符
- 函数参数与返回值
Integer i= 10; //自动装箱[包装类的ValueOf()实现]
int b = i; //自动拆箱[包装类的xxxValue()]xxx是对应的包装类名
五、浮点数不能表示金额
- 浮点数是近似值,表示金额会精度丢失
- 用BigDecimal实现精确运算