Java面经--从代码角度认识面向对象编程和面向过程编程

1. 思维方式和核心概念

  • 面向过程编程:核心是过程(procedure),即通过函数来组织和实现功能。程序被分为一系列的步骤或过程,数据和功能分离,代码通常是顺序执行的。

  • 面向对象编程:核心是对象(object),对象是现实世界中实体的抽象。对象包含了数据(属性)和行为(方法),通过将数据与功能封装到对象内部,强调代码的复用性、灵活性和可维护性。

2. 代码组织方式

2.1. 面向过程编程

在面向过程编程中,程序是围绕函数(过程)组织的。函数是执行特定任务的代码块,数据在函数之间通过参数传递。数据和操作是分离的。

面向过程的代码示例:

#include <stdio.h>// 全局变量表示学生的基本信息
char name[50];
int age;
int score;// 函数用于打印学生信息
void printStudentInfo() {printf("Name: %s\n", name);printf("Age: %d\n", age);printf("Score: %d\n", score);
}int main() {// 设置学生信息sprintf(name, "Alice");age = 20;score = 85;// 打印学生信息printStudentInfo();return 0;
}

特点:

  • 数据(nameagescore)和操作(printStudentInfo)是分开的。
  • 函数 printStudentInfo 操作全局变量,没有对数据进行封装,数据是裸露的。
2.2. 面向对象编程

面向对象编程通过来组织代码,类是对象的模板,它定义了数据(属性)和行为(方法)。对象是类的实例,数据和操作被封装在对象内部。

面向对象的代码示例:

class Student {// 私有属性表示学生的基本信息private String name;private int age;private int score;// 构造函数用于初始化学生对象public Student(String name, int age, int score) {this.name = name;this.age = age;this.score = score;}// 方法用于打印学生信息public void printStudentInfo() {System.out.println("Name: " + name);System.out.println("Age: " + age);System.out.println("Score: " + score);}
}public class Main {public static void main(String[] args) {// 创建学生对象,并初始化属性Student student = new Student("Alice", 20, 85);// 调用方法,打印学生信息student.printStudentInfo();}
}

特点:

  • 数据(nameagescore)和操作(printStudentInfo)被封装在类 Student 中。
  • 类通过封装机制保护数据,外界只能通过方法访问数据,增强了安全性。
  • 类可以实例化多个对象,每个对象都有自己的数据副本。

3. 封装、继承和多态

3.1 封装
  • 面向过程:数据和操作是分离的,没有封装的概念,数据常常是全局变量或由外部传入的参数。
  • 面向对象:通过封装机制,数据和操作被捆绑在一起,数据是类的内部属性,外部无法直接访问,只能通过类的方法进行操作。

面向对象的封装示例:

class Student {private String name; // 数据是私有的// 通过方法来访问和修改数据public String getName() {return name;}public void setName(String name) {this.name = name;}
}
3.2 继承
  • 面向过程:不存在继承的概念,代码复用依赖于函数的调用或代码拷贝,难以管理。
  • 面向对象:类可以继承另一个类的属性和方法,子类通过继承复用父类的代码,并能根据需要扩展或修改父类的行为。

继承的示例:

class Person {private String name;public Person(String name) {this.name = name;}public void greet() {System.out.println("Hello, my name is " + name);}
}class Student extends Person {private int score;public Student(String name, int score) {super(name); // 调用父类的构造方法this.score = score;}public void showScore() {System.out.println("My score is " + score);}
}public class Main {public static void main(String[] args) {Student student = new Student("Alice", 85);student.greet();       // 调用继承自 Person 的方法student.showScore();   // 调用 Student 自己的方法}
}

继承的好处

  • 代码复用:子类继承了父类的功能,减少重复代码。
  • 扩展性:可以在子类中添加新功能,且不影响父类。
3.3 多态
  • 面向过程:函数根据名称调用,没有多态的概念。不同的功能需要不同的函数实现。
  • 面向对象:通过多态,子类可以重写父类的方法,程序可以在运行时根据对象的实际类型调用相应的方法。多态支持更灵活的代码设计,适合扩展和维护。

多态的示例:

class Animal {public void makeSound() {System.out.println("Some generic animal sound");}
}class Dog extends Animal {@Overridepublic void makeSound() {System.out.println("Woof!");}
}class Cat extends Animal {@Overridepublic void makeSound() {System.out.println("Meow!");}
}public class Main {public static void main(String[] args) {Animal animal1 = new Dog();  // 父类引用指向子类对象Animal animal2 = new Cat();animal1.makeSound();  // 输出:Woof!animal2.makeSound();  // 输出:Meow!}
}

多态的好处

  • 多态允许我们在编译时将不同子类对象作为父类来处理,运行时调用实际对象的方法。这种机制使代码更加灵活,易于扩展。

4. 代码复用性与扩展性

  • 面向过程:代码复用主要通过函数来实现,扩展性差。如果需要修改或扩展功能,通常需要改动多个地方的代码。
  • 面向对象:代码通过类和继承来复用。面向对象的封装、继承、多态特性使得程序更容易扩展和维护。只需要继承父类或实现接口即可实现代码的扩展,且不影响现有代码。

5. 适用场景

  • 面向过程编程

    • 适合解决简单的、任务导向型的问题。
    • 适合对底层资源的直接控制,或小型、短期的项目。
    • C 语言等偏向硬件开发和系统编程的场景更常用面向过程编程。
  • 面向对象编程

    • 适合大型复杂系统的开发,特别是业务逻辑复杂、需要长期维护和扩展的项目。
    • 常用于企业级应用、面向服务的架构、游戏开发等。
    • Java、C++、Python 等高级语言常用面向对象编程进行开发。

总结

  1. 面向过程编程:通过函数实现功能,数据和行为是分离的,适用于简单的程序设计。
  2. 面向对象编程:通过类和对象来组织代码,强调封装、继承和多态,能够提高代码的复用性和扩展性,适用于复杂的系统开发。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/55884.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

回归涉及的函数

当然可以&#xff01;以下是你学习笔记中涉及到的函数的详细讲解&#xff1a; 1. 导入必要的库 import: 用于导入所需的库和模块。例如&#xff0c;import numpy as np 导入 NumPy 库并简写为 np。 2. 读取数据 pd.read_csv(temps.csv): 读取指定路径的 CSV 文件&#xff0…

苹果秋季盛典:iPhone 16系列引领未来科技潮流

9月10日&#xff0c;苹果公司在众人瞩目中举办了2024年的秋季特别活动&#xff0c;发布了备受期待的iPhone 16系列。 尽管网络发布会已经持续了一整年&#xff0c;但熬夜观看的果粉们仍然热情不减&#xff0c;因为每一次苹果的新品发布都代表着科技界的一次重大飞跃。 iPhone …

使用C++的OpenSSL 库实现 AES 加密和解密文件

如果C不知道做什么项目&#xff0c;可以编写一个文件加密和解密工具&#xff0c;支持诸如 AES 和 RSA 等常见的加密算法。这样的项目可以帮助学习和理解现代加密技术&#xff0c;并为日常文件保护提供便利。以下是一个基本的设计思路和实现步骤&#xff1a; 1. 设计思路 a. 功…

Android常用组件

目录 1. TextView 控件 常用属性: 1&#xff09;android:text: 2&#xff09;android:gravity: 3&#xff09;android:textSize: 4&#xff09;android:textColor: 5&#xff09;android:background: 6&#xff09;android:padding: 7&#xff09;android:layout_width 和 andr…

嵌入式C语言中链表的插入实现方法

大家好,今天主要给大家分享一下,如何使用链表插入功能。 第一:嵌入式中链表具体实现 链表查找思路:从链表的a0起,判断是否为第i结点,若是则返回该结点的指针,否则查找下一结点,依次类推。 具体代码的链表插入实现: linklist Locate(linklist_t h, data_t x) { …

MySQL 分组

MySQL 分组 在数据库管理中&#xff0c;分组是一种强大的功能&#xff0c;它允许用户根据一个或多个列对数据进行分类&#xff0c;并对每个组执行聚合操作。MySQL 作为最流行的关系型数据库管理系统之一&#xff0c;提供了丰富的分组功能。本文将详细介绍 MySQL 中的分组概念、…

Android车载——VehicleHal运行流程(Android 11)

1 概述 本篇主要讲解VehicleHal的主要运行流程&#xff0c;包括设置属性、获取属性、订阅属性、取消订阅、持续上报属性订阅等。 2 获取属性流程 2.1 获取属性流程源码分析 作为服务注册到hwServiceManager中的类是VehicleHalManager&#xff0c;所以&#xff0c;CarServic…

WOFOST模型与PCSE模型

农作物生长模型概述 1、介绍农作物生长模型的用途和应用领域 2、比较WOFOST模型和PCSE模型的特点和优势 数据准备 1、气象数据&#xff1a; 数据类型&#xff1a;温度、降水、湿度、风速等气象要素数据。 数据格式&#xff1a;时间序列数据&#xff0c;通常以日为单位。 …

EXCELWPS工作表批量重命名(按照sheet1中A列内容)

将工作表名称批量重命名&#xff08;按照sheet1中A列内容&#xff09; 打开WPS Office的Excel文件。按 Alt F11 打开VBA编辑器。在VBA编辑器中&#xff0c;插入一个新模块&#xff1a;点击 插入 -> 模块。将以下代码粘贴到模块中&#xff1a;运行→运行宏 Sub RenameShee…

使用 Vertex AI Gemini 模型和 Elasticsearch Playground 快速创建 RAG 应用程序

作者&#xff1a;来自 Elastic Jeff Vestal 在这篇博客中&#xff0c;我们将使用 Elastic 的 Playground 和 Vertex AI API 将 Elasticsearch 连接到 Google 的 Gemini 1.5 聊天模型。将 Gemini 模型添加到 Playground 使 Google Cloud 开发人员能够快速建立 LLM、测试检索、调…

宠物空气净化器怎么选?希喂、霍尼韦尔、美的宠物哪款除毛好?

身为养宠五年的资深铲屎官&#xff0c;最近收到了很多新手养宠朋友关于宠物空气净化器的挑选疑问。宠物空气净化器作为宠物领域目前最火热的产品&#xff0c;谈论度一直很高&#xff0c;评价也褒贬不一。双十一购物节又即将到来&#xff0c;大家都想赶上这一波优惠活动。 铺天盖…

低代码工单管理app评测,功能与效率解析

预计到2030年&#xff0c;低代码平台市场将达1870亿美元。ZohoCreator助力企业构建定制化软件应用&#xff0c;以建筑行业工作订单管理app为例&#xff0c;简化流程&#xff0c;提升管理效率&#xff0c;降低成本。其用户友好界面、自动化管理、跨平台使用及全面报告功能受企业…

基于差分进化灰狼混合优化的SVM(DE-GWO-SVM)数据预测算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1 DE优化 4.2 GWO优化 5.完整程序 1.程序功能描述 基于差分进化灰狼混合优化的SVM(DE-GWO-SVM)数据预测算法matlab仿真&#xff0c;对比SVM和GWO-SVM。 2.测试软件版本以及运行结果展示…

实施威胁暴露管理、降低网络风险暴露的最佳实践

随着传统漏洞管理的发展&#xff0c;TEM 解决了因攻击面扩大和安全工具分散而产生的巨大风险。 主动式 TEM 方法优先考虑风险并与现有安全工具无缝集成&#xff0c;使组织能够在威胁被有效利用之前缓解威胁。 为什么威胁暴露管理 (TEM) 在现代网络安全策略中变得至关重要&…

获取时隔半个钟的三天

摘要&#xff1a; 今天遇到需求是配送时间&#xff0c;时隔半个钟的排线&#xff01;所以需要拼接时间&#xff01;例如2024-10-08 14&#xff1a;30&#xff0c;2024-10-08 15&#xff1a;00&#xff0c;2024-10-08 15&#xff1a;30 <el-form-item label"配送时间&a…

如何使用bpmn-js实现可视化流程管理

介绍 BPMN-JS是一个流行的开源库&#xff0c;用于在Web应用程序中可视化、创建、编辑和分析BPMN&#xff08;Business Process Model and Notation&#xff0c;业务流程建模与表示法&#xff09;2.0 图。BPMN是一种国际标准的图形化语言&#xff0c;用于描述企业中的业务流程&a…

【数据结构】string(C++模拟实现)

string构造 string::string(const char* str):_size(strlen(str)) {_str new char[_size 1];_capacity _size;strcpy(_str, str); }// s2(s1) string::string(const string& s) {_str new char[s._capacity 1];strcpy(_str, s._str);_size s._size;_capacity s._cap…

BlackMarket_ 1靶机渗透

项目地址 plain https://download.vulnhub.com/blackmarket/BlackMarket.zip 实验过程 开启靶机虚拟机 ![](https://img-blog.csdnimg.cn/img_convert/169d964d61ea9660c1104e723f71449e.png) 使用nmap进行主机发现&#xff0c;获取靶机IP地址 plain nmap 192.168.47.1-254…

图论day57|建造最大岛屿(卡码网)【截至目前,图论的最高难度】

图论day57|建造最大岛屿&#xff08;卡码网&#xff09;【截至目前所做的题中&#xff0c;图论的最高难度】 思维导图分析 104.建造最大岛屿&#xff08;卡码网&#xff09;【截至目前所做的题中&#xff0c;图论的最高难度】 思维导图分析 104.建造最大岛屿&#xff08;卡码网…

git在已有的项目基础上获取远程仓库指定分支操作方法

要在本地项目中拉取远程仓库的特定分支&#xff0c;你可以使用以下步骤&#xff1a; 确保你已经有了一个本地的 Git 项目。运行 git fetch 命令来获取远程仓库的所有更新。使用 git checkout 命令切换到你想要的远程分支。 # 1. 获取远程仓库的所有更新 git fetch origin# 2.…