面向对象编程
基本概念
在 OOP 中,class 和 instance 是“模版”和“实例”的关系;
定义 class 就是定义了一种数据类型,对应的 instance 是这种数据类型的实例;
通过 new 操作符创建新的 instance,然后用变量指向它,即可通过变量来引用这个 instance;
使用
类属性设置为 private,不允许外部直接修改,需要通过调用实例方法修改和读取。
类通过定义方法,就可以给外部代码暴露一些操作的接口,同时,内部自己保证逻辑一致性。
方法可以让外部代码安全地访问实例中的字段。
修饰符
- public:定义了类对外提供的功能
- private:访问权限被限定在 class 的内部,外部无法调用
- protected:子类,以及子类的子类可以访问
this 变量
在方法内部,可以使用一个隐含的变量 this,它始终指向当前实例。
如果没有命名冲突,可以省略 this。
继承
继承是面向对象编程的一种强大的代码复用方式。
子类的构造方法可以通过 super()调用父类的构造方法;
继承有个特点,就是子类无法访问父类的 private 字段或者 private 方法。
为了让子类可以访问父类的字段,我们需要把 private 改为 protected。用 protected 修饰的字段可以被子类访问。
多态
Override:复写
Overload:方法重载
final
- 修饰的方法可以阻止被覆写
- 修饰的 class 可以阻止被继承
- 修饰的 field 必须在创建对象时初始化,随后不可修改
子类可以覆写父类的方法
多态的特性就是,运行期才能动态决定调用的子类方法。
抽象类
- abstract
通过 abstract 定义的方法是抽象方法,它只有定义,没有实现。抽象方法定义了子类必须实现的接口规范;
定义了抽象方法的 class 必须被定义为抽象类,从抽象类继承的子类必须实现抽象方法;
抽象类本身被设计成只能用于被继承,因此,抽象类可以强迫子类实现其定义的抽象方法,否则编译会报错。因此,抽象方法实际上相当于定义了“规范”。
面向抽象编程:
尽量引用高层类型,避免引用实际子类型的方式,称之为面向抽象编程。
上层代码只定义规范,不需要子类就可以实现业务逻辑,具体的业务逻辑由不同的子类实现,调用者并不关心。
面向抽象编程使得调用者只关心抽象方法的定义,不关心子类的具体实现。
接口
- interface
- implements
- default:实现类可以不必覆写 default 方法
接口(interface)定义了纯抽象规范,一个类可以实现多个接口;
接口的所有方法都是抽象方法,接口不能定义实例字段;
静态字段和静态方法
- static
静态字段属于所有实例“共享”的字段,实际上是属于 class 的字段;
推荐用类名来访问静态字段和方法。
实例字段在每个实例中都有自己的一个独立“空间”,但是静态字段只有一个共享“空间”,所有实例都会共享该字段。
调用静态方法不需要实例,无法访问 this,但可以访问静态字段和其他静态方法;
静态方法常用于工具类和辅助方法。
核心类
- String
- StringBuilder
- StringJoiner
- 包装类型
- JavaBean
- 枚举
String
在 Java 中,String 是一个引用类型,它本身也是一个 class。但是,Java 编译器对 String 有特殊处理,即可以直接用"..."来表示一个字符串。
Java 字符串 String 是不可变对象;
字符串操作不改变原字符串内容,而是返回新字符串;
两个字符串比较,必须总是使用 equals()方法。