通俗易举例说明面向对象和面向过程有什么区别_System

一. 面向对象

1. 概念

可以说,在面向对象的编程规范中,“一切皆对象”,对象就是面向对象编程的核心。我们把现实世界中的一个个对象或物体,抽象地体现在编程世界中。就好比我们想驾驶一辆奥迪A6,A6就是一个对象,制造商给A6赋予了各种功能和特性,我们就可以调用这个对象完成一系列操控。所以每一个对象都可以包含一系列具体的操作,最终一个个的对象又组成了完整的Java程序。这些对象可以是独立存在的,也可以是从别的对象中继承过来的。对象之间通过相互作用传递信息,实现程序开发。

给大家举个去吃点栗子,按照面向对象的解决思维就是:

1.  创造一个“餐厅”对象,去做饭;

2.  创造一个“人”对象,去吃饭;

2. 特点

在面向对象编程中,一个对象会有以下特点:

● 对象具有属性和行为;

● 对象具有变化的状态;

● 对象具有唯一性;

● 对象都是某个类的实例;

● 一切皆对象,真实世界中所有的事物都可以视为对象。

当然,如果只是这样跟大家解释一通,很多小白肯定还是不明白到底啥是面向对象。别急,面向对象是一种认知思维,一种思维的养成,并不是一朝一夕就可以形成的。有些科班出身的Java程序员,在学校里接触了很久的面向对象,甚至都做了几年的开发,真让他解释啥是面向对象,他依然很懵懂。我们要想真正地理解面向对象,只看几篇文章和视频是很难吃透的。你需要进行大量的编程实践,写着写着,有一天你就会突然顿悟:“啊,原来这就是面向对象啊”!

二. 面向过程

1. 概念

面向过程的编程思想其实很机械粗暴,所有的事情都可以拆分成一系列要执行的计算步骤,通常采用自上而下、顺序执行的方式来实现。还是给大家举吃饭的栗子,如果是按照面向过程的解决思维就是:

1.  到餐厅;

2.  点菜;

3.  点餐具;

4.  打印菜品明细;

5.  打印餐具明细;

6.  后厨根据菜品明细开始做饭;

7.  .......

你看,整个执行逻辑就是这么机械粗暴,简单明了。面向过程就是把目标的实现拆分成了一个个的实现过程,而每一步又可以继续拆分成若干个子步骤。这种解决问题的思维,与面向对象是有明显不同的。

2. 特点

根据以上分析,我们可以感受到面向过程的优点在于,性能上它比面向对象要高。因为在面向对象中,我们在调用类时需要进行实例化,开销比较大。但面向过程的缺点也很明显,代码不易维护、复用和扩展性都很差,开发效率较低。所以面向过程的开发技术,主要是用在单片机、嵌入式开发、Linux/Unix等对性能要求较高,代码改动不频繁的场景中。

三. 面向对象和面向过程的区别

接下来我们就按照上述描述的:“去吃饭”的栗子来给大家直观的看看面向对象和面向过程的区别是什么吧!

1. 面向对象

// 创建一个人类
class Person {
    private String name; // 人名
    private int age; // 年龄
    private String gender; // 性别

    // 构造函数
    public Person(String name, int age, String gender) {
        this.name = name;
        this.age = age;
        this.gender = gender;
    }

    // getter方法
    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public String getGender() {
        return gender;
    }

    // 吃饭方法
    public void eat() {
        System.out.println(name + "正在吃饭");
    }
}

// 创建一个餐厅类
class Restaurant {
    private String name; // 餐厅名
    private String address; // 地址

    // 构造函数
    public Restaurant(String name, String address) {
        this.name = name;
        this.address = address;
    }

    // getter方法
    public String getName() {
        return name;
    }

    public String getAddress() {
        return address;
    }

    // 提供餐食的方法
    public void provideFood() {
        System.out.println("提供美食,欢迎光临!");
    }
}

// 创建一个主函数类
public class goToDinner {
    public static void main(String[] args) {
        // 创建一个人对象
        Person person = new Person("张三", 25, "男");
        System.out.println(person.getName() + "今年" + person.getAge() + "岁,是个成年" + person.getGender() + "人");

        // 创建一个餐厅对象
        Restaurant restaurant = new Restaurant("饕餮大酒楼", "上海市黄浦区南京东路");
        System.out.println("欢迎来到" + restaurant.getName() + ",地址:" + restaurant.getAddress());

        // 人在餐厅吃饭
        person.eat();
        restaurant.provideFood();
    }
}

在这个栗子中:

首先我们通过创建Person类(定义了吃饭的方法eat())和Restaurant类(定义了提供餐食的方法provideFood()),将人和餐厅抽象为对象,并在goToDinner类中通过实例化对象,模拟了一个人在餐厅吃饭的场景。

先不着急分析,我们继续向下看

2. 面向过程

import java.util.Scanner;

public class GoToEat {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        
        // 输出欢迎信息
        System.out.println("欢迎来到餐厅!");
        
        // 获取用户输入
        System.out.print("请输入您要点的菜品:");
        String dish = input.nextLine();
        
        System.out.print("请输入您需要的餐具(筷子/勺子):");
        String utensils = input.nextLine();
        
        // 打印用户输入
        System.out.println("您点的菜品是:" + dish);
        System.out.println("您需要的餐具是:" + utensils);
        
        // 做饭
        cook(dish);
        
        // 洗碗
        wash(utensils);
        
        // 输出结束信息
        System.out.println("餐点准备好了,开始用餐吧!");
    }
    
    // 做饭
    public static void cook(String dish) {
        System.out.println("开始做" + dish + "...");
        System.out.println("做好了!");
    }
    
    // 洗碗
    public static void wash(String utensils) {
        System.out.println("开始洗" + utensils + "...");
        System.out.println("洗好了!");
    }
}

在上述这个栗子中:

首先输出欢迎来到餐厅的欢迎信息,然后需要获取用户输入的菜品和餐具信息,打印出来之后,调用cook()方法来做饭和调用wash()方法来洗碗,最后输出一切准备结束的信息:"餐点准备好了,开始用餐吧!"表示可以用餐了,整个执行过程就非常的流程化。

通过对比,面向过程的编程它的特点就是:

强调程序执行的顺序和流程,不过面向过程编程最大的优点就是代码确实非常简单易懂,非常适合解决小规模的问题,但是他的缺点就是难以应对一些复杂的问题,代码的可读性差,不易维护和扩展。

相比较之下,面向对象编程更强调的是面向对象的设计,所有的事情都让指定的对象去做,通过定义类和对象,将问题分解成更小的问题,并通过将对象之间的交互解决问题。就像上述的面向对象编程中它人和餐厅抽象为对象,将去吃饭的问题看作是由对象组成的。

同时我们也发现面向对象的编程就是将复杂的问题抽象成简单的类,从而降低了程序的复杂程度,也提高了代码的可读性和可维护性,但是面向对象编程通常需要大量的类和对象来实现程序功能,这会导致代码的复杂度增加,从而降低代码的可读性和可维护性。

四. 总结

最后给大家做一下梳理吧:

面向过程的优点和缺点是什么?

1.  优点:

● 特别易于理解和学习,面向过程编程非常直观和简单,因为它模拟了现实世界中的过程和操作。初学者可以很容易地理解和学习这种编程方式。

● 面向过程编程的代码非常简单易懂,代码的结构相对简单,没有复杂的层次结构,因此易于阅读和理解。

2.  缺点:

● 面向过程编程缺乏高层次的抽象,因此当需要增加新的功能时,代码往往需要被完全重构。

● 面向过程编程难以处理大规模项目,因为代码的结构很难管理和维护。此外,面向过程编程不利于代码复用和模块化,这使得大规模项目的开发更加困难。

面向对象的优点和缺点是什么?

1.  优点:

● 面向对象编程可以将复杂的问题抽象成简单的类,从而降低程序的复杂度,提高代码的可读性和可维护性。

● 继承和多态是面向对象编程的两个重要特性。继承可以让子类继承父类的属性和方法,从而减少代码的重复性;多态则可以让不同的对象对同一消息作出不同的响应,提高了程序的灵活性和可扩展性。

● 面向对象编程将数据和方法封装在类中,只对外部提供必要的接口,从而增强了程序的安全性和稳定性。

2.  缺点:

● 面向对象编程通常需要大量的类和对象来实现程序的功能,这会导致代码复杂度的增加,降低代码的可读性和可维护性。

● 面向对象编程需要频繁地创建和销毁对象,这会导致一定的性能损失。

● 面向对象编程需要掌握一定的面向对象思想和编程技巧,需要一定的学习成本。

面向对象和面向过程的区别是什么?

1.  面向过程编程是一种基于程序和函数的编程范式,它强调程序的执行顺序和数据的处理过程,通过将程序分解成一系列函数来完成任务。在面向过程编程中,数据和函数是分开的,数据被看作是被函数处理的对象。因此,面向过程编程更加注重解决问题的过程,而不是问题的对象。

2.  面向对象编程是一种以对象为中心的编程范式,它将数据和函数作为一个整体来处理,这些数据和函数被封装在一个对象中,通过对象之间的交互来完成任务。在面向对象编程中,对象被看作是问题的解决方案,因此,面向对象编程更加注重问题的对象,而不是解决问题的过程。

3.  面向对象编程中有三个基本概念:封装、继承、多态。

● 封装是指将数据和函数组合在一起形成一个对象,并将其隐藏在对象内部,只提供公共接口给外部使用。

● 继承是指从一个已有的类中派生出一个新类,新类可以使用已有类的属性和方法,同时也可以添加自己的属性和方法。

● 多态是指不同对象对同一消息做出不同的响应,即同一方法可以在不同的对象中具有不同的行为。

总而言之,面向过程编程更加注重程序的执行过程,而面向对象编程更加注重的是对象和对象之间的交互。