# Java

# 重点理论:

  1. 单纯interface可以统一方法的调用,但是它不能统一对象的实例化
  2. 面向对象主要做两件事情:实例化对象 调用方法 (完成业务逻辑)
  3. 只有一段代码中没有new的出现,才能保持代码的相对稳定,才能逐步实现
  4. 上面的这句话只是表象,实质是一段代码如果要保持稳定,就不应该负责对象的实例化
  5. 对象实例化是不可能消除的
  6. 把对象实例化的过程,转移到其他的代码片段里
  7. 代码中总是会存在不稳定,隔离这些不稳定,保证其他的代码是稳定的。
  8. 变化造成了不稳定
  9. 配置文件属于系统外部的,而不属于代码本身

# 简介

为什么Java应用最广泛? 从互联网到企业平台,Java是应用最广泛的编程语言,原因在于:

  • Java是基于JVM虚拟机的跨平台语言,一次编写,到处运行;
  • Java程序易于编写,而且有内置垃圾收集,不必考虑内存管理;
  • Java虚拟机拥有工业级的稳定性和高度优化的性能,且经过了长时期的考验;
  • Java拥有最广泛的开源社区支持,各种高质量组件随时可用。

# 快速入门

  1. 变量

分为两种:基本类型的变量和引用类型的变量

基本类型:

  1. 整数类型:byte,short,int,long
  2. 浮点数类型:float,double
  3. 字符类型:char
  4. 布尔类型:boolean

面向对象编程:

  1. 在OOP中,class和instance是“模版”和“实例”的关系;
  2. 定义class就是定义了一种数据类型,对应的instance是这种数据类型的实例;
  3. class定义的field,在每个instance都会拥有各自的field,且互不干扰;
  4. 通过new操作符创建新的instance,然后用变量指向它,即可通过变量来引用这个instance;
  5. 访问实例字段的方法是变量名.字段名;
  6. 指向instance的变量都是引用变量。

# 方法重载

方法名相同,但各自的参数不同,称为方法重载(Overload)。 注意:方法重载的返回值类型通常都是相同的。 重载方法应该完成类似的功能,参考String的indexOf()

# 继承

使用extends关键字来实现继承

只允许一个class继承自一个类,一个类有且仅有一个父类,只有Object特殊,他没有父类

子类不会继承任何父类的构造方法,子类默认的构造方法是编译器自动生成的,不是继承的

instanceof 实际上判断一个变量所指向的实例是否是指定类型,或者这个类型的子类。

子类和父类的关系是is,has关系不能用继承

继承是is关系,组合是has关系

# 多态

覆写(override)

如果方法签名相同,并且返回值也相同,就是override

实例方法调用是基于运行时的实际类型的动态调用,而非变量的声明类型

这种特性称之为多态(Polymorphic)

多态的特性是,运行期才能动态决定调用的子类方法。

用final修饰的方法不能被override

可以在构造方法中初始化final字段

# 抽象类

如果父类的方法本身不需要实现任何功能,仅仅是为了定义方法签名,目的是让子类去覆写它,可以把父类的方法声明为抽象方法

抽象类本身被设计成只能用于被继承,抽象类可以强迫子类实现其定义的抽象方法,否则编译会报错

面向抽象编程的本质:

  • 上层代码只定义规范
  • 不需要子类就可以实现业务逻辑(正常编译)
  • 具体的业务逻辑由不同的子类实现,调用者并不关心

# 接口

如果一个抽象类没有字段,所有方法都是抽象方法,就可以把该抽象类改写成接口:interface 所谓interface,就是比抽象类还要抽象的纯抽象接口,连字段都不能有

实现一个interface时,需要使用implements 关键字

一个类可以实现多个interface

接口继承

使用extends

实现类可以不必覆写default方法

# 静态字段和静态方法

class中定义的字段,称之为实例字段。特点是,每个实例都有独立的字段,各个实例的同名字段互不影响

static修饰的字段,称之为静态字段

实例字段在每个实例中都有自己的一个独立空间,但是静态字段只有一个共享空间,所有实例都会共享该字段

推荐用类名来访问静态字段

# 接口的静态字段

interface是可以有静态字段的,并且必须是final类型

#

# 作用域

public、protected、private、package

定义为public的class、interface可以被其他任何类访问

定义为private的field、method无法被其他类访问

protected作用于继承关系,定义为protected的字段和方法可以被子类访问,以及子类的子类

# 模块

# Java核心类

# 字符串

String是一个引用类型,本身也是一个class

字符串比较,必须使用equals()

忽略大小写比较,使用equalsIgnoreCase()

contains()、indexOf()、lastIndexOf()、startsWith()、endsWith()、substring()、trim()、strip() stripLeading()、stripTrailing() isEmpty() isBlank() replace() replaceAll() split() join() String.valueOf() 把任意基本类型或引用类型转换为字符串

# StringBuilder

StringBuilder是可变对象,用来高效拼接字符串 StringBuilder可以支持链式操作,实现链式操作的关键是返回实例本身 StringBuffer是StringBuilder的线程安全版本,现在很少使用

# StringJoiner

用指定分隔符拼接字符串数组时,使用StringJoiner或String.join()更方便 用StringJoiner拼接字符串时,还可以额外附加一个"开头"和"结尾"

# 包装类型

# 枚举类

好处:

  1. enum常量本身带有类型信息,编译器会自动检查出类型错误
  2. 不可能引用到非枚举的值,因为无法通过编译
  3. 不同类型的枚举不能互相比较或者赋值,因为类型不符
  4. 编译器可以在编译期自动检查出所有可能的潜在错误

因为enum类型的每个常量在JVM中只有一个唯一实例,所以可以直接用==比较

enum定义的类型是class

有以下几个特点:

  1. 定义的enum类型总是继承自java.lang.Enum,且无法被继承
  2. 只能定义出enum的实例,而无法通过new操作符创建enum的实例
  3. 定义的每个实例都是引用类型的唯一实例
  4. 可以将enum类型用于switch语句

# BigDecimal

用于表示精确的小数,常用于财务计算 比较BigDecimal的值是否相等,必须使用compareTo()而不是使用equals()

# 异常处理

# 反射

反射是为了解决在运行期,对某个实例一无所知的情况下,如何调用其方法。

# 注解

注解是Java语言用于工具处理的标注 注解可以配置参数,没有指定配置的参数使用默认值 如果参数名称是value,且只有一个参数,那么可以省略参数名称

# 泛型

泛型是一种“代码模板”,可以用一套代码套用各种类型。

# 集合

由若干个确定的元素所构成的整体

Java的集合类定义在java.util包中,支持泛型,主要提供了3种集合类,包括List,Set和Map。

# List

List接口允许我们添加重复的元素 还允许添加null

# 日期与时间

要获取当前时间戳,可以使用System.currentTimeMillis()

# JDBC

是Java DataBase Connectivity的缩写,是Java程序访问数据库的标准接口

IOC的具体意义:容器 加入容器 注入 抽象意义:控制权交给用户