首页 > 其他分享 >面向对象与面向过程

面向对象与面向过程

时间:2024-08-01 10:50:14浏览次数:8  
标签:面向对象 amount 面向 println balance 过程 public

面向对象


概念:

面向对象编程(Object-Oriented Programming,简称OOP)是一种编程范式,它使用“对象”来设计软件。对象可以包含数据(通常称为属性或字段)和代码(通常称为方法或函数)。

类(class):

类是对象的蓝图或模板,它定义了对象的结构和行为。类可以包含属性(数据)和方法(函数)。

public class Car {
    private String color;
    private int speed;
    public Car(String color) {
    this.color = color;
    this.speed = 0;
}

    public void setColor(String color) {
    this.color = color;
    }

    public String getColor() {
    return color;
    }

    public void move() {
    speed = 50; // 假设速度
    System.out.println("The car is moving at " + speed + " km/h.");
    }
}

对象(Object):

对象是类的实例。每个对象都有其自身的状态和行为。

public class Main {
    public static void main(String[] args) {
        Car myCar = new Car("Red"); // 创建Car类的对象
        myCar.move(); // 调用对象的方法
    }
}

继承(Inheritance):

继承是一种机制,允许新创建的类(子类)继承现有类(父类或基类)的属性和方法。这支持代码复用并可以创建层次结构。

public class ElectricCar extends Car { // ElectricCar继承Car类
    private boolean isCharging;

    public ElectricCar(String color, boolean isCharging) {
        super(color); // 调用父类的构造方法
        this.isCharging = isCharging;
    }

    public void charge() {
        isCharging = true;
        System.out.println("The electric car is charging.");
    }
}

封装(Encapsulation):

封装是将对象的数据(属性)和行为(方法)组合在一起的过程,同时隐藏内部细节,只暴露有限的操作界面。

public class BankAccount {
    // 私有属性,封装账户余额
    private double balance;

    // 构造方法,初始化账户余额
    public BankAccount(double initialBalance) {
        if (initialBalance >= 0) {
            this.balance = initialBalance;
        } else {
            this.balance = 0;
            System.out.println("Initial balance cannot be negative.");
        }
    }

    // 公共方法,用于存款
    public void deposit(double amount) {
        if (amount > 0) {
            balance += amount;
            System.out.println("Deposited " + amount + " to the account.");
        } else {
            System.out.println("Deposit amount must be positive.");
        }
    }

    // 公共方法,用于取款
    public boolean withdraw(double amount) {
        if (amount > 0 && amount <= balance) {
            balance -= amount;
            System.out.println("Withdrew " + amount + " from the account.");
            return true;
        } else {
            System.out.println("Invalid withdrawal amount.");
            return false;
        }
    }

    // 公共方法,用于获取当前余额
    public double getBalance() {
        return balance;
    }

    // 公共方法,用于设置新余额
    public void setBalance(double newBalance) {
        if (newBalance >= 0) {
            balance = newBalance;
            System.out.println("Account balance set to " + newBalance);
        } else {
            System.out.println("Balance cannot be negative.");
        }
    }
}

// 测试BankAccount类
public class Main {
    public static void main(String[] args) {
        BankAccount myAccount = new BankAccount(1000); // 创建账户,初始余额1000
        myAccount.deposit(500); // 存入500
        System.out.println("Current balance: " + myAccount.getBalance()); // 打印当前余额
        myAccount.withdraw(200); // 取出200
        System.out.println("Current balance: " + myAccount.getBalance()); // 再次打印当前余额
        myAccount.setBalance(-50); // 尝试设置负余额
    }
}

多态(Polymorphism):

多态允许同一个接口接受不同的数据类型。在OOP中,多态可以通过方法重载(静态多态)和方法重写(动态多态)实现。

public class CarDemo {
    public static void show(Car car) {
        car.move(); // 多态方法调用
    }

    public static void main(String[] args) {
        Car myCar = new Car("Blue");
        ElectricCar myElectricCar = new ElectricCar("Green", true);

        show(myCar); // 正确,因为myCar是Car类型
        show(myElectricCar); // 正确,因为ElectricCar是Car的子类
    }
}

抽象(Abstraction):

抽象是简化复杂的现实世界问题的过程,只关注对于当前目标相关的部分。在OOP中,这通常通过抽象类和接口实现。

public abstract class Vehicle {
    protected String brand;

    public Vehicle(String brand) {
        this.brand = brand;
    }

    public abstract void move(); // 抽象方法
}

public class Bicycle extends Vehicle {
    public Bicycle(String brand) {
        super(brand);
    }

    @Override
    public void move() {
        System.out.println(brand + " bicycle is moving.");
    }
}

面向对象编程的优点包括:

代码复用

通过继承和多态,可以减少代码重复。

易于维护

封装和抽象使得代码更易于理解和修改。

模块化

面向对象的设计使得软件更加模块化,有助于大型项目的管理。

灵活性和可扩展性

面向对象的设计使得软件更容易扩展和适应变化。

面向过程


面向过程编程(Procedural Programming)是一种编程范式,它侧重于将程序分解为一系列的过程或函数。这种范式与面向对象编程(OOP)不同,它不使用对象来封装数据和行为。

特点:

过程或函数:

程序由一系列的过程或函数组成,每个过程或函数执行特定的任务。

数据和函数分离:

数据通常作为全局变量或通过参数传递给函数,而不是封装在对象中。

模块化:

程序被分解为模块,每个模块包含一组相关的函数和全局变量。

顺序执行:

程序的执行通常是按照代码的顺序进行的,从上到下。

重用性:

函数可以在不同的程序中重用,但它们通常不包含与数据相关的逻辑。

易于理解和调试:

由于程序结构简单,面向过程的代码通常更容易理解和调试。

面向过程编程的优点包括:

简单性

对于简单的程序,面向过程的方法可能更直观和简单。

性能

在某些情况下,面向过程的程序可能比面向对象的程序有更好的性能,因为它们避免了对象创建和方法调用的开销。

控制性

程序员对程序流程有更直接的控制。

面向过程编程的缺点包括:

可维护性

随着程序规模的增大,面向过程的代码可能变得难以维护。

可扩展性

当需要添加新功能时,面向过程的代码可能需要更多的修改和重构。

重用性

虽然函数可以重用,但数据和逻辑的分离可能导致代码重复。

public class BankAccountSystem {

    // 定义全局变量,表示账户余额
    private static double balance = 1000;

    // 存款函数
    public static void deposit(double amount) {
        if (amount > 0) {
            balance += amount;
            System.out.println("Deposited " + amount + " to the account.");
        } else {
            System.out.println("Deposit amount must be positive.");
        }
    }

    // 取款函数
    public static boolean withdraw(double amount) {
        if (amount > 0 && amount <= balance) {
            balance -= amount;
            System.out.println("Withdrew " + amount + " from the account.");
            return true;
        } else {
            System.out.println("Invalid withdrawal amount.");
            return false;
        }
    }

    // 主函数
    public static void main(String[] args) {
        deposit(500); // 存入500
        System.out.println("Current balance: " + balance); // 打印当前余额
        boolean withdrawalSuccess = withdraw(200); // 取出200
        if (withdrawalSuccess) {
            System.out.println("Current balance: " + balance); // 再次打印当前余额
        } else {
            System.out.println("Withdrawal failed.");
        }
    }
}

面向对象与面向过程的区别


数据与功能的组织方式

  • 面向对象:数据和处理数据的方法被封装在对象中。每个对象都是数据和功能的集合。

  • 面向过程:数据和处理数据的函数是分离的。函数通常操作全局变量或通过参数传递的数据。

抽象级别

  • 面向对象:通过类和对象提供更高的抽象级别,隐藏了实现细节。
  • 面向过程:通常以较低的抽象级别操作,直接处理数据和逻辑。

代码复用

  • 面向对象:通过继承和多态性,代码复用更加自然和广泛。
  • 面向过程:函数可以在不同的程序中重用,但复用通常限于函数级别。

模块化

  • 面向对象:通过对象和类的封装,代码更加模块化。
  • 面向过程:模块化通过将代码分解为一系列函数和全局变量实现。

维护和扩展

  • 面向对象:由于封装和模块化,维护和扩展通常更加容易。
  • 面向过程:随着程序规模的增大,维护和扩展可能变得更加困难。

设计方法

  • 面向对象:设计通常基于现实世界的对象和它们之间的交互。
  • 面向过程:设计通常基于解决问题所需的步骤和过程。

语言支持

  • 面向对象:许多现代编程语言(如Java、C++、Python)天然支持面向对象编程。
  • 面向过程:几乎所有编程语言都支持面向过程编程,但一些语言可能不提供面向对象的特性。

性能

  • 面向对象:由于额外的抽象层,可能存在轻微的性能开销。
  • 面向过程:通常具有更好的性能,因为直接操作数据和控制流程。

调试和测试

  • 面向对象:由于封装,可能更难以调试和测试单个组件。
  • 面向过程:由于代码结构简单,调试和测试可能更直接。

编程范式

  • 面向对象:强调使用类和对象来模拟现实世界实体。
  • 面向过程:强调使用过程或函数来解决问题。

让我们通过一个简单的银行账户管理的例子来说明面向对象编程和面向过程编程的区别。我们将创建一个简单的系统,该系统允许用户存款和取款。

面向对象编程示例

// 面向对象的BankAccount类
public class BankAccount {
    private double balance; // 封装的私有属性

    public BankAccount(double initialBalance) {
        this.balance = initialBalance;
    }

    // 存款方法
    public void deposit(double amount) {
        if (amount > 0) {
            balance += amount;
            System.out.println("Deposited " + amount);
        } else {
            System.out.println("Invalid deposit amount.");
        }
    }

    // 取款方法
    public boolean withdraw(double amount) {
        if (amount > 0 && amount <= balance) {
            balance -= amount;
            System.out.println("Withdrew " + amount);
            return true;
        } else {
            System.out.println("Invalid withdrawal amount or insufficient funds.");
            return false;
        }
    }

    // 获取余额的方法
    public double getBalance() {
        return balance;
    }
}

// 主类
public class Main {
    public static void main(String[] args) {
        BankAccount account = new BankAccount(1000); // 创建对象
        account.deposit(500); // 调用对象的存款方法
        System.out.println("Balance: " + account.getBalance()); // 调用对象的获取余额方法
        account.withdraw(200); // 调用对象的取款方法
    }
}

在这个面向对象的示例中,我们创建了一个BankAccount类,它封装了余额和相关操作(存款和取款)。然后,我们创建了BankAccount的一个实例,并调用了它的方法来执行操作。

面向过程编程示例

// 面向过程的全局变量
public class BankAccountSystem {
    public static double balance = 1000; // 面向过程的全局变量

    // 存款函数
    public static void deposit(double amount) {
        if (amount > 0) {
            balance += amount;
            System.out.println("Deposited " + amount);
        } else {
            System.out.println("Invalid deposit amount.");
        }
    }

    // 取款函数
    public static boolean withdraw(double amount) {
        if (amount > 0 && amount <= balance) {
            balance -= amount;
            System.out.println("Withdrew " + amount);
            return true;
        } else {
            System.out.println("Invalid withdrawal amount or insufficient funds.");
            return false;
        }
    }

    // 主函数
    public static void main(String[] args) {
        deposit(500); // 直接调用存款函数
        System.out.println("Balance: " + balance); // 直接访问全局变量
        withdraw(200); // 直接调用取款函数
    }
}

在这个面向过程的示例中,我们没有创建类来封装数据和行为。相反,我们使用了全局变量balance和一系列静态函数来执行存款和取款操作。这些函数直接操作全局变量,没有对象的创建和使用。

  • 面向对象:我们创建了BankAccount类,它封装了数据和行为。我们通过创建类的实例来使用它的方法。
  • 面向过程:我们定义了一组函数来执行操作,并且使用全局变量来存储状态。没有创建类实例,函数直接操作全局状态。

这两种方法都可以实现相同的功能,但是面向对象的方法提供了更好的封装、更易于维护和扩展的代码结构,而面向过程的方法可能在小规模或简单的程序中更加直观和易于实现。

标签:面向对象,amount,面向,println,balance,过程,public
From: https://www.cnblogs.com/czj03/p/18336210

相关文章

  • 面向对象与面向过程
    面向对象与面向过程面向对象(Object-OrientedProgramming,OOP)与面向过程(Procedure-OrientedProgramming,POP)是两种主要的编程范式,它们在编程思想、特点、优势及应用场景等方面存在显著差异。一、编程思想面向对象:以对象作为基本程序结构单位,程序的设计围绕对象进行。对象具......
  • JAVA—面向对象编程基础
              面向对象是java编程的套路。更符合人类思维习惯,编程更直观。面向对象有三大特征:封装,继承,多态。目录1.理解面向对象2.对象在计算机中的执行原理 3.类和对象的一些注意事项 4.类与对象的一些语法知识(1)this关键字(2)构造器(3)封装 (4)实体javaBean(实体......
  • Java入门基础-11面向对象高级(二)
    Java入门基础-11面向对象高级(二)本章知识点总结于黑马程序员的视频课程:《Java入门基础课程》,是对上课做的笔记Java入门基础课程视频地址Java入门基础-10面向对象高级目录Java入门基础-11面向对象高级(二)前言面向对象的三大特征之三:多态认识多态使用多态的好处、类型......
  • 全网最适合入门的面向对象编程教程:29 类和对象的Python实现-断言与防御性编程和help函
    全网最适合入门的面向对象编程教程:29类和对象的Python实现-断言与防御性编程和help函数的使用摘要:在Python中,断言是一种常用的调试工具,它允许程序员编写一条检查某个条件。本文主要介绍了断言的应用场景和特点以及assert语句的使用,同时介绍了防御性编程和help()函数......
  • Java面向对象
    Java面向对象(OOP)学习面向对象的三条主线1、Java中类及类的成员2、面向对象的三大特征3、其他关键字的使用Java中类及类的成员1、成员变量(或属性)2、方法(函数)3、构造器(或构造方法)4、代码块(或初始化块)5、内部类面向对象的三大特征封装性、继承性、多态性(+抽象性)其他关......
  • C++面向对象编程解析
    文章目录1.概述2.作用解析3.概念解析1.类和对象2.封装(Encapsulation)3.继承(Inheritance)4.多态(Polymorphism)1.概述C++是在C语言的基础上增加了面向对象编程(OOP)特性的编程语言。面向对象编程是一种编程范式,通过将程序组织成对象的集合,这些对象包含数据和行......
  • 【系统架构设计师】二十一、面向服务架构设计理论与实践②
    目录四、SOA主要协议和规范五、SOA设计的标准要求5.1SOA设计标准5.2服务质量六、 SOA的作用与设计原则七、SOA的设计模式7.1服务注册表模式7.2企业服务总线模式7.3微服务模式八、SOA的构建与实施8.1构建SOA时应该注意的问题8.2SOA的实施过程8.3 业务......
  • HBuilderX 开发中使用 Node.js 搭建PDA扫码程序的服务端过程
    以下是使用HBuilderX和Node.js搭建程序服务端的大致步骤: 1. 安装Node.js首先,从Node.js官方网站下载并安装适合您操作系统的版本。在命令提示符中执行node-v,npm-v,检查nodejs版本是否安装完成。配置环境变量。2. 安装Oracle客户端根据您的操作系统,下载并安......
  • 奶奶都能学会的Linux系统nginx安装详细过程
    nginx安装安装前准备下载nginx源码包编译安装服务优化控制命令编辑网站首页访问验证Nginx的优点包括:性能高效,适合高并发环境资源消耗低,适合资源受限的环境配置简单,易于理解和修改轻量级,占用较少内存可靠性高,长时间运行中保持稳定性安装前准备1.依赖下载[root......
  • 记一次连正确的账密都无法通过控制台登录的处理过程
    背景:用户的一台生产机器在许久之前就出现了SSH无法登录操作系统(Ubuntu22.04系统)的现象,但由于生产环境是有多台机器在支撑业务的,所以坏一台也不会影响业务,但用户近期将此问题反馈了过来想让帮忙解决掉此问题,但询问操作系统内做了哪些操作,给的答复都是很模糊,可以说完全不知道.........