java基础
-
JDK 和 JRE 区别
- JDK: Java Development KLit, Java 开发工具包, 包含开发环境和运行环境
- 编译器
- 调试器
- 其他工具
- JRE
- JRE: Java Runtime Environment, Jav 运行时环境
- JVM
- API
- 支持文件
- JDK: Java Development KLit, Java 开发工具包, 包含开发环境和运行环境
-
Java11后没有 JRE 怎么办?服务器安装什么?
-
== 和 equals 区别
- == 比较引用是否相等(基本类型比较值是否相等)
- equals 为 Object 的方法, 默认比较引用是否相等, 可重写
-
常用类的 equals
- 基本类型包装类: 重写为比较值
- String 重写了, 必须是 String 才可比较, 比较字符序列是否相等
- StringBuilder 和 StringBuffer 都没有重写
-
hashCode 相同, equals 一定为 true?
- equals 等则 hashCode 一定要等.
- hashCode 等, equals 不一定等
-
final 的作用
- 类: 不可被继承
- 方法: 不可被重写(可修饰静态与实例)
- 字段: 必须赋值且只可赋值一次(可修饰静态与实例)
-
String 是基本数据类型吗
- 不是, 是引用类型
- 8种基本数据类型: char、byte、short、int、long、float、double、boolean
-
String、StringBuffer、StringBuilder 区别
- String 不可变, 其他两者均可变
- String 和 StringBuffer 线程安全, StringBuilder 非线程安全
- StringBuilder 效率最高
-
StringBuffer 和 String 的线程安全有什么区别
- String 是因为不可变而导致的线程安全
- StringBuffer 是使用 synchronized 关键字保证线程安全
-
抽象类
- 与普通类最大的区别就是不能实例化
- 可包含抽象方法, 也可不含
- 不能使用 final 修饰, 因为抽象类必须要被继承从而被实现
-
接口的进化
- JDK7: 接口中的所有方法都是抽象方法
- JDK8: 新增默认方法 default 关键字、类方法(均public)(JDK8及前接口中还仅能有public)
- JDK9: 新增私有方法(私有实例和私有静态)
--- 但还是不能有 protected 的
--- protected 是能修饰 static 的(无论是方法还是字段)
--- 注意 JDK8 的接口是能有 main 方法且可执行的
-
接口与抽象类区别
- 共性
- 抽象方法都是对共性行为的抽象
- 不能进行实例化
- 区别
- 单继承与多继承
- 抽象类可以有实例变量和静态变量, 接口只能有public static final 【字段】
- 接口不能有普通方法 【方法】
- 接口不能有初始化 【构造函数、静态初始化块、实例初始化块】
- 共性
-
接口优点
- 抽象类用于实现通用逻辑, 然后将非通用逻辑交给子类实现, 模板方法模式
- 接口多继承
- 对外提供规则, 降低耦合性(规则定义好, 模块化开发), 体现了行为与规范分离的原则
-
重载 Overload
- 一个类中可见的方法中, 方法名相同, 参数列表不同. 其他可同可不同
- 也即静态和示例也可重载
-
重写 Override
-
子类对父类方法重写, 返回值和形参列表都必须相同
-
访问级别必须>=父类, 声明抛出的首检异常必须<=父类(非受检不限制), 返回值必须>=父类
-
static 不能重写, 但可再次声明(父子类不同, 静态绑定)
-
private 不能重写, 但可被覆盖(private是静态绑定吗)
-
构造函数不能被重写
-
调用父类被重写的方法, 可使用 super
-
-
动态绑定和静态绑定
-
静态绑定: 编译期即可确定调用的是那个类的方法, final、static、private 是静态绑定的
-
动态绑定: 运行时才可知道具体的执行方法,
-
动态绑定过程
- VM 提取对象的实际类型方法表
- VM 搜索方法签名
- 调用方法
-
存在动态绑定的原因是在编译期无法确定具体的类型 + 重写 ==> 多态
-
-
BIO、NIO、AIO
- BIO: Block IO, 同步阻塞式IO
- NIO: New IO, 同步非阻塞IO, 通过 Channel 通讯, 实现了多路复用
- AIO: Asynchronous IO, NIO2, 异步非阻塞IO, 异步IO的操作给予事件和回调机制
- 问题: 同步异步?阻塞非阻塞?
-
IO流
- 功能分: 输入输出流
- 类型分: 字节字符流
-
hashCode 和 equals 的重写
- String 的 hashCode
-
面向对象基本特征
- 封装
- 继承
- 多态
- 举例及理解
-
面向对象优缺点
-
设计模式七大基本原则 SOLID
- 单一职责原则 Single Responsibility Principle,SRP
- 开闭原则 Open Closed Principle,OCP
- 里氏替换原则 Liskov Substitution Principle
- 依赖倒置原则 Dependency Inversion Principle
- 接口隔离原则 Interface Segregation Principle
- 迪米特法则
- 组合/聚合复用原则
最常用和理解的
单一职责
:类、方法的功能职责要单一,降低耦合,另一方面可简单理解为就是要短小精悍,这个基本可看《代码整洁之道》- 开闭原则:代码需要能很容易的添加新功能,而不必修改原有代码,有点插件思想的意思。
可扩展性
- 里氏替换:程序里的对象都能被其子类替换而不影响其正常工作。
- 接口隔离:多个专用接口比一个通用接口好。一个类不要去实现用不到的接口。
- 依赖倒置:高层次模块不应该依赖低层次模块,应该都依赖于抽象;抽象不应依赖于细节,细节依赖于抽象。降低依赖
- https://developer.aliyun.com/article/226577
- http://www.imooc.com/article/51098
- https://www.cnblogs.com/sunflower627/p/4718702.html