目录
面向对象
编程范式:
1)过程式编程
2)函数式编程
3)面向对象编程
4)响应式编程
5)并发编程
6面向切面编程
类和对象
类(class) 是描述一类事物的模板,而**对象(object)**则是这根据类这个模板创建的具体实例。
创建对象语法:类型 变量名 = new 类型();

对象内存结构
对象需要在堆内存申请空间,存储数据 对象的变量在栈内存,存储的是对象在堆中的地址引用,所以也叫引用数据类型。

注意事项:
把一个对象变量赋值给另一个变量,会导致两个变量持有同一个对象的引用。使用任意变量修改对象属性,会导致另一个变量访问到的属性跟着变化

封装
过程式编程
面向过程编程有哪些问题?
所有代码写在一个类中,非常臃肿
方法的参数可能非常多,不方便维护
代码冗长,不方便定位BUG
代码之间耦合严重,修改代码会造成连锁反应
代码复用性差
java
public class SalaryDemo {
public static void main(String[] args) {
// 基础薪资
double baseSalary = 5000.0;
// 奖金
double bonus = 1000.0;
// 绩效评级
char grade = 'C';
// 计算最终薪资
double salary = calculateSalary(
baseSalary, bonus, grade);
System.out.println("基础薪资: " + baseSalary);
}
private static double calculateSalary(
double baseSalary,
double bonus,
char grade) {
// 计算绩效系数
double rate = calculateRate(grade);
// 计算最终薪资
return baseSalary + bonus * rate;
}
private static double calculateRate(char grade) {
return switch (grade) {
case 'A' -> 1.0;
case 'B' -> 0.8;
case 'C' -> 0.6;
case 'D' -> 0.4;
default -> 0.0;
};
}
}
封装
是面向对象的核心特点之一,要求将数据和操作这些数据的方法捆绑在一起,作为一个整体。


封装后为:

Getter和Setter
通常情况下,类中的属性(成员变量)不应该被直接操作(不应该人工赋值),而是提供setter方法用于修改类中的数据,提供getter方法用于访问类中的数据。

很显然人工复赋值的时候会有错误产生。
我们应该先用private关键字将属性进行私有化,然后创建一个可以对外访问的方法,我们叫Set方法
set方法负责给成员变量赋值,必要的时候可以做校验
get可以获取值


封装的细节:
类中的成员变量应该用private修饰
提供setter和getter方法用来操作类中的成员变量
当方法参数与类中字段名一致时,可以用this.变量名来区分成员变量和方法参数
降低耦合
耦合(Coupling)是指事物之间存在相互依赖、相互影响、相互制约的情况。在程序设计中是指一个类依赖于另一个类的程度。

构造方法
构造方法(Constructor)是在创建对象时调用的方法,作用是在创建对象时初始化对象中的字段(Field)。
/* 默认构造方法,空参构造方法
不需要写返回值,返回值其实就是当前类对象
方法名就是当前类名
构造方法的作用:就是给成员变量完成初始化
空参构造,会给成员变量默认的初始值(数字默认为0,布尔默认为false)
*/
总结:
什么是封装?
封装是面向对象的三大特征之一,简单来说就是把数据和操作数据的方法放到一起
封装的目的是为了降低耦合,提高程序的可维护性、可复用性
如何实现封装?
把数据和操作数据的方法放到一个类中,作为类的成员变量和成员方法
成员变量私有化,对外提供Getter和Setter方法操作成员变量
对于必须初始化的成员变量,以构造方法来接收参数完成初始化
隐藏不必要的细节,只对外暴露必要的方法

set方法仍然有用,可以进行校验逻辑
继承和多态
继承
在程序设计中,继承是指让一个类继承另一个类的成员,从而提高代码的复用性。
案例:
商品分为实体商品(苹果)和虚拟商品(网盘会员),每个商品都有名称和价格。
创建一个商品类为父类,再创建一个类为实体商品类继承。

通过测试类发现,都可以实现调用

调用时会发现有这些方法并不是我们定义的,这些是jdk中自带的,当一个类没有继承任何类的时候会默认继承Object类
当我们手动继承,再按住ctrl跟进,就能看到里边的方法了

按ctrl+f12就能看到object类中所有方法

总结
什么是继承?
一个类继承另一个类,就可以访问被继承类的非私有成员。
被继承的类叫父类,继承父类的类是子类。
Java中用extends关键字实现继承。
继承有什么特点?
Java中只能单继承,也就是一个人只能有一个爸爸
Java中可以多重继承,也就是爸爸还可以有爸爸
Java中有一个顶级父类,叫做Object
父子构造

构造方法作用:初始化成员变量。
super();存在的意义:
由于父类中变量都为private私有,子类无法调用,所以采用super()的方式才能调用到父类中的成员变量
执行顺序如下

通过有参构造实现调用子类的方法时不会调用父类的方法。

内存模型
创建对象要基于类的模版进行创建
元空间用于存放类的模板

方法的覆写(重写)
覆写(Override)也叫重写,是指子类定义了一个与父类中声明完全相同,但实现不同的方法。子类的实现就覆盖了父类的实现。
案例:
商品分为实体商品(苹果)和虚拟商品(网盘会员),每个商品都有名称和价格。
创建一个商品类为父类,再创建一个类为实体商品类继承。

实体商品有重量虚拟商品没有重量,多了一个秘钥属性

Final关键字
我们发现objec中有些方法是无法重写的,因为他们都被final关键字修饰了。
总结:
什么是方法覆写
覆写也叫重写(override),是指子类定义了一个与父类中声明完全相同,但实现不同的方法。子类的实现就覆盖了父类的实现。
覆写父类方法时可以在方法上添加@Override标识,编译器会做覆写检查
方法覆写的作用:
在父类方法基础上拓展子类特有的功能
Final关键字:
修饰变量:变量的值不可修改,就成为常量。常量名一般全都大写,单词之间以_隔开.
修饰方法:方法不可被覆写
修饰类:类不可被继承