杰瑞科技汇

Java到底是面向对象还是面向过程?

这是一个非常经典且重要的问题,答案是:

Java到底是面向对象还是面向过程?-图1
(图片来源网络,侵删)

Java 是一门纯粹的面向对象编程语言,但它也吸收了面向过程编程的一些思想。

下面我们来详细解释这句话的含义。

核心定义:什么是面向对象 vs. 面向过程?

面向过程

  • 思想核心以过程为中心,程序被视为一系列按顺序执行的指令或步骤,你把解决问题的步骤想清楚,然后用函数把这些步骤一步步实现。
  • 关注点“怎么做” (How to do)
  • 好比:像做菜,你有一份详细的食谱:第一步,洗菜;第二步,切菜;第三步,热锅;第四步,下油…… 你严格按照这个流程来操作。
  • 优点:逻辑清晰,简单直接,适合解决那些步骤固定、逻辑线性的小问题。
  • 缺点:代码复用性差,难以应对复杂、多变的需求,当需求改变时,可能需要修改大量代码,牵一发而动全身。
  • 代表语言:C语言。

面向对象

  • 思想核心以对象为中心,程序由多个相互协作的“对象”组成,每个对象都是数据和操作该数据的方法(函数)的封装。
  • 关注点“谁来做” (Who does what),你首先会思考问题中涉及哪些实体(对象),每个实体有什么属性(数据)和行为(方法),然后让这些对象之间相互协作来完成功能。
  • 好比:像组织一个团队来完成项目,你不会只写一份“如何完成项目”的流程,而是会定义不同的角色(对象),项目经理”、“程序员”、“测试员”,每个角色都有自己负责的任务(方法)和掌握的信息(属性),项目经理协调程序员和测试员,他们各自完成自己的工作。
  • 优点
    • 封装:隐藏对象的内部细节,只对外暴露接口,提高了安全性。
    • 继承:子类可以继承父类的属性和方法,实现了代码复用和扩展。
    • 多态:同一操作作用于不同的对象,可以有不同的解释和执行结果,增加了灵活性和可扩展性。
  • 缺点:相对于面向过程,概念更复杂,对于非常简单的问题可能会显得“小题大做”。
  • 代表语言:Java, C++, C#, Python。

为什么说 Java 是面向对象?

Java 的设计初衷就是为了解决 C++ 等语言的复杂性,并更好地支持大型软件项目的开发,它从语言层面强制要求并提供了强大的面向对象特性。

Java 的核心支柱就是面向对象思想:

Java到底是面向对象还是面向过程?-图2
(图片来源网络,侵删)
  1. 万物皆对象:在 Java 中,你几乎总是在创建和使用对象,即使是 main 方法,也必须在一个类的对象(或类本身)的上下文中运行。
  2. 类与对象class 是 Java 的基本单位,你通过定义 class 来创建蓝图,然后通过 new 关键字来创建类的实例,即对象。
  3. 封装:通过 private, public, protected 等访问修饰符,可以控制类、方法和属性的可见性,实现数据隐藏。
  4. 继承:使用 extends 关键字,一个类可以继承另一个类的非私有成员,实现代码的复用和层次化设计。
  5. 多态:通过方法重载和重写,结合继承机制,实现了多态,这使得你可以编写更通用、更灵活的代码,你可以定义一个 Animal 类,然后让 DogCat 都继承它,你可以用一个 Animal 类型的变量来接收 DogCat 的对象,并调用它们各自重写的方法。

一个简单的 Java 例子:

// 1. 定义一个类(蓝图)
class Dog {
    // 属性(数据)
    private String name;
    // 构造方法
    public Dog(String name) {
        this.name = name;
    }
    // 方法(行为)
    public void bark() {
        System.out.println(name + " says: Woof!");
    }
}
// 2. 在主程序中创建对象并使用
public class Main {
    public static void main(String[] args) {
        // 创建 Dog 类的对象
        Dog myDog = new Dog("Buddy");
        // 调用对象的方法
        myDog.bark(); // 输出: Buddy says: Woof!
    }
}

这个例子清晰地展示了 Java 的核心是围绕“对象” (myDog) 和它的“行为” (bark()) 构建的。


Java 中“面向过程”的痕迹在哪里?

尽管 Java 是面向对象的,但它的底层实现和一些语法特性仍然保留了面向过程的影子。

  1. main 方法:程序的入口点 public static void main(String[] args) 本身就是一个静态的、面向过程的入口,它是一个不需要创建对象就能执行的函数,这是典型的面向过程思想,你可以把它看作是整个程序的“启动脚本”。
  2. 方法:Java 中的方法本质上就是面向过程的“函数”,它们接收输入,执行一系列操作,然后返回输出,在类内部,这些方法构成了对象的行为,但在宏观上,你仍然是在调用一个个方法来完成功能。
  3. 底层实现:Java 虚拟机 本身是用 C/C++(面向过程语言)编写的,JVM 的启动和执行过程是高度过程化的。
  4. 一些工具类:像 java.lang.Math 这样的工具类,所有方法都是 static 的,你直接通过类名调用方法,如 Math.sqrt(16),而不是创建一个 Math 对象,这在一定程度上提供了类似面向过程的便利性。
特性 面向对象 面向过程
编程范式 以对象为中心 以过程/函数为中心
Java 的体现 核心思想,类、对象、封装、继承、多态是 Java 的基石。 辅助和底层main 方法、static 方法、JVM 实现等体现了过程化思想。
设计哲学 “让对象去工作” “一步步地执行指令”

Java 是一门彻头彻尾的面向对象编程语言。 它的设计、语法和核心库都围绕对象和类构建,为了与底层系统交互、提供便捷性以及保持与 C/C++ 等语言的兼容性,它也不可避免地使用了一些面向过程的概念(如 static 方法和 main 函数)。

Java到底是面向对象还是面向过程?-图3
(图片来源网络,侵删)

你可以这样理解:Java 的“骨架”是面向对象的,而它的“血肉”(一些具体实现)中流淌着面向过程的血液。 但作为开发者,你主要使用的是它的面向对象特性来构建应用程序。

分享:
扫描分享到社交APP
上一篇
下一篇