程序
程序就是数据结构和算法
程序设计
程序设计是设计、构造、实现、和维护计算机程序所涉及到的 技术
面向对象程序设计
面向对象是 一种 软件 开发 规范
请回忆一下面向对象程序设计吧
面向对象是一种编程范式,它将程序视为一系列相互交互的对象集合。通常,对象由属性(数据)和方法(行为)组成。在当前大多数编程语言中,面向对象编程是一种基本范式,除了函数式编程之外,其它常见编程范式还有过程式编程、泛型编程、逻辑编程、声明式编程等。
在没有明确的理论指导和实践规范的情况下,程序员很难高效地开发程序。因此,自上而下的分阶段程序开发方法逐渐兴起
在程序开发过程中,对输入和输出的处理方式会对其开发和设计产生影响。过程式编程是以函数(过程)为主线的编程。面向过程编程是最接近计算机执行机制的编程方式,过程是以函数调用的顺序执行的,利用函数库的函数来完成编程任务
由于人类思维与程序执行存在一定的抽象执行力,单纯的过程式编程会使得程序设计变得复杂,增加理解难度
因此,诞生了面向对象编程,它通过重新组织数据结构和对数据的操作,使其更贴近人类思维方式
程序设计整体上是 一门艺术
面向对象程序设计(OOP)是一种编程范式,它将程序分解为不同的对象,这些对象包含数据和操作数据的方法。OOP 的主要特点是封装、继承和多态。封装隐藏了对象的内部状态和实现细节,只暴露必要的接口;继承允许创建共享方法的类的层次结构;多态允许使用父类类型的变量引用子类对象,以实现相同接口的不同行为。
在OOP中,对象是类的实例。类定义了对象的行为和状态,是一个蓝图。
封装:
- 将数据和操作数据的方法绑定在一起,隐藏内部实现细节,只暴露必要的接口。
- 通过访问修饰符(如 public、private、protected)控制对类成员的访问。
继承:
- 从现有类派生新类,继承父类的属性和方法,并可添加、重写或扩展功能。
- 促进代码的重用和扩展性。
多态:
- 同一接口或方法调用可有不同的实现方式。
- 例如,重载(overload)和重写(override)。
重载:
- 同名方法,但参数列表不同(类型、数量或顺序),在编译时多态。
- 示例:定义多个同名但签名不同的方法。
重写:
- 子类重新定义父类已声明的方法,方法名、参数列表相同,但实现不同
重载与重写的区别
重载是发生在同一个类中,方法名相同但参数列表不同;重写是发生在有继承关系的类中,子类重新定义父类的方法,且方法名和参数列表必须相同
访问修饰符
private:仅允许在当前类内部访问。
protected:允许在当前类、子类和同包类中访问。
public:无限制,任何类都可以访问。
protected 关键字
package A;
import package.B.*;
public class C extends A.B {
public void method() {
new package.B();
}
}
在没有明确的理论指导和实践规范的情况下,程序员很难高效地开发程序。因此,自上而下的分阶段程序开发方法逐渐兴起
在程序开发过程中,对输入和输出的处理方式会对其开发和设计产生影响。过程式编程是以函数(过程)为主线的编程。面向过程编程是最接近计算机执行机制的编程方式,过程是以函数调用的顺序执行的,利用函数库的函数来完成编程任务
由于人类思维与程序执行存在一定的抽象执行力,单纯的过程式编程会使得程序设计变得复杂,增加理解难度
因此,诞生了面向对象编程,它通过重新组织数据结构和对数据的操作,使其更贴近人类思维方式
程序设计整体上是 一门艺术
面向对象程序设计(OOP)是一种编程范式,它将程序分解为不同的对象,这些对象包含数据和操作数据的方法。OOP 的主要特点是封装、继承和多态。封装隐藏了对象的内部状态和实现细节,只暴露必要的接口;继承允许创建共享方法的类的层次结构;多态允许使用父类类型的变量引用子类对象,以实现相同接口的不同行为。
在OOP中,对象是类的实例。类定义了对象的行为和状态,是一个蓝图。
封装:
- 将数据和操作数据的方法绑定在一起,隐藏内部实现细节,只暴露必要的接口。
- 通过访问修饰符(如 public、private、protected)控制对类成员的访问。
继承:
- 从现有类派生新类,继承父类的属性和方法,并可添加、重写或扩展功能。
- 促进代码的重用和扩展性。
多态:
- 同一接口或方法调用可有不同的实现方式。
- 例如,重载(overload)和重写(override)。
重载:
- 同名方法,但参数列表不同(类型、数量或顺序),在编译时多态。
- 示例:定义多个同名但签名不同的方法。
重写:
- 子类重新定义父类已声明的方法,方法名、参数列表相同,但实现不同
重载与重写的区别
重载是发生在同一个类中,方法名相同但参数列表不同;重写是发生在有继承关系的类中,子类重新定义父类的方法,且方法名和参数列表必须相同
访问修饰符
private:仅允许在当前类内部访问。
protected:允许在当前类、子类和同包类中访问。
public:无限制,任何类都可以访问。
protected 关键字
package A;
import package.B.*;
public class C extends A.B {
public void method() {
new package.B();
}
}
最后,我们需要理解继承的穿透性和重写的方法覆盖机制
内部类
- JDK 1.1 之前支持,还很初级,内部类会
可变长度参数
- 方法的参数列表中的椭圆符号 ... 表示可变参数
- 调用时,可以传递可变数量的参数
类的初始化:
- 类的初始化发生在类的加载过程中,当程序首次主动使用该类时,或者在运行时某方法发现之前没有被主动使用过,则该类会被加载、连接、初始化。
- 主动使用包括:创建类的实例、访问类的静态字段、调用类的静态方法、反射调用类等;如果表达式结果为目标类型的转换方法,也视为对目标类型的主动引用。静态方法调用,只要所在的类从根开始被加载,就会在首次主动使用时被初始化,JVM可以为某个类单独触发初始化,如果初始化失败,可能得不到正确结果或者抛出异常
- 在初始化一个类时, JVM 会递归地先初始化其所有父类
循环依赖
- 发生在同一模块中的两个或更多类,它们之间相互调用,就构成了循环依赖。循环依赖是程序设计中需要避免的结构
构造器的核心工作是确保新创建的对象处于一致、可用的状态。初始化块和静态初始化器也是定义初始化行为的方式
静态初始化 (aka Static Initializer )是一种初始化类数据成员的机制。它提供了与构造器相同语法的初始化代码块(
如:
static {
代码块
}
),但用于初始化静态数据成员。静态初始化是随着类加载过程进行的,它只能初始化 static 数据成员,非 static 由构造器初始化。静态初始化器由关键字 static 开启,放在类声明中。程序员可定义多个静态初始化器,但顺序与书写顺序相同。静态初始化器中不允许使用 this 关键字,因为类在加载时尚未被完全创建
初始化的过程如下:
1. 加载类,为类变量分配内存,并设置为默认值
2. 执行静态初始化器,给类变量赋初值
3. 准备完成,类处于就绪状态,可通过类名访问类变量
初始化一个类时,构造器也会被调用,具体是 new 关键字会触发方法。 new 关键字触发的方法实际上由执行引擎解释执行,涉及:
① 对象空间的分配
② 调用父类的方法
③ 初始化成员变量(默认值)
④ 执行构造器
⑤ 返回引用
不过,现代JIT编译器可能会优化执行过程,例如内联调用父类构造器等
final 的类不能被继承,使用final关键字修饰的类默认为public,如果仅用final修饰,则只能被private修改
最后,泛型和集合是程序设计的另一个重要领域,涉及到类型安全和集合数据结构。

