在这里插入图片描述

个人主页-爱因斯晨

优秀文章推荐

文章目录

    • 个人主页-爱因斯晨
    • 优秀文章推荐
    • 引言
    • 一、三种调用机制概述
      • C语言的库函数
      • Python 的导包机制
      • Java 的 API 接口调用
      • 综上:
    • 二、它们的相同点:封装与调用
    • 三、不同之处
      • **对比核心维度**
      • **细节串讲**
        • 1. **C 语言:最原始的“过程式调用”**
        • 2. **Python:模块化 + 面向对象**
        • 3. **Java:纯面向对象 + 严格接口**
      • 通俗理解:不同“买菜方式”
    • 四、统一视角下的“调用模型”
    • 五、总结升华

引言

作为一个小菜鸟,在恶补C语言库函数的时候,联想到这与Java中的API接口Python中的导入模块是不是本质上就是调用封装好的代码,在本语言中的能效是不是一样的。我感觉应该是大差不差,但是做学问不能大差不差。于是,我悄悄的去查了一下,我猜对了哈哈。本质上是一样的,思想上是一样的,但在底层原理和调用机制上有些差别,也就是有了语言特色。我能有这样的想法,值得小小的骄傲一下。抽象思考的开始就是在进步~

针对这一问题正文开始:

一、三种调用机制概述

我们先来看看这三种语言在代码中的基本使用方式:

C语言的库函数

C 是一种过程式语言,没有类和对象的概念。我们使用 #include 指令引入标准库头文件,然后调用其中的函数。例如:

#include <stdio.h>int main() {printf("Hello, world!\n");return 0;
}

printf() 就是标准库 stdio.h 中封装好的一个函数。使用者无需关心其内部实现,只需知道用法即可。


Python 的导包机制

Python 提倡模块化开发,标准库和第三方库都以“模块”的形式存在,使用时通过 import 语句引入。例如:

import math
print(math.sqrt(25))

你也可以选择性导入模块中的某个函数:

from math import sqrt
print(sqrt(25))

模块中可以包含函数、类、变量等内容。Python 的导入机制十分灵活,符合其动态解释型语言的特性。

像这样的常用的还有:

import numpy as np #数值计算
import pandas as pd #数据分析处理
import matplotlib.pyplot as plt #数据可视化

不要问博主为什么熟悉这三个模块,问就是数模的痛啊!!


Java 的 API 接口调用

Java 是面向对象语言,一切都以“类”的方式封装。我们通过 import 语句引入需要使用的类,再通过对象或静态方式调用其方

法。例如:

import java.util.ArrayList;public class Demo {public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();list.add("Hello");System.out.println(list.get(0));}
}

Java 的类库庞大、分类严谨,并且有详细的文档支持(Java API 文档),是开发中不可或缺的一部分。博主至今没找到和阿伟

老师同一版的API文档,有的小伙伴儿请分享给博主啊,主页介绍有微信,求求了。博主的主要学习语言是java,PyC学的

不深呐

综上:

C语言库函数是通过 #include 引入头文件 + 链接库文件。

Python 中通过 import 语句导入模块或包。

Java 中通过 import 引入类/接口,通过 API 使用类库功能。


二、它们的相同点:封装与调用

我们看了他们的调用方式,现在来盘点一下就是是怎样一个相同的本质:

无论是哪种语言,这些机制都有一个共同目标:

封装好的功能模块可直接调用,提升开发效率。

总结起来,它们都具备以下特征:

  • 都是封装调用机制
  • 隐藏内部实现,暴露接口/函数/类
  • 目的是复用代码、提高效率
  • 可组合使用,形成更大程序

注:有朋友可能会误解:**封装不是在java中才有的吗?**在java中,封装确实作为面向对象编程三大块之一(封装、继承、多态)。

但不是它特有的,它是所有现代编程语言中普遍存在的一种软件设计思想,只是 Java 对封装的表达最为“显式”和“制度化”,所

以很多人第一次认真接触封装,往往是在 Java 中。

三、不同之处

对比核心维度

比较维度C 语言(库函数)Python(导包)Java(API 接口)
使用方式#include <stdio.h>import mathimport java.util.List
调用方式printf()math.sqrt()list.get(0)
类型函数库(头文件+链接库)模块、包、类类库、接口、类
底层机制静态/动态链接动态解释器导入(模块缓存)JVM 加载 .class 文件
面向对象否(过程式)是(支持 OOP)是(纯 OOP)
封装灵活性低(靠程序员自觉)高(可灵活封装)中(封装严格)

细节串讲

1. C 语言:最原始的“过程式调用”
  • #include 把头文件里写好的声明引入进来(告诉编译器有这些函数)。
  • 真正的实现.c 文件里,通过编译器生成的目标文件或链接库 .lib / .so / .dll 被链接进程序。
  • static 可以让函数只在文件内可见,相当于局部封装。
  • C 只提供了最小的封装手段,程序员需要靠命名和约定去遵守接口和封装(没有访问控制符)。

优点:非常灵活,高效。

缺点:没有强制封装和可扩展的模块系统,容易踩坑。


2. Python:模块化 + 面向对象
  • import 把整个模块或其中部分成员引入到当前命名空间。
  • 模块可以包含变量、函数、类等,是功能单元。
  • 通过 ___all__ 机制来控制哪些是“对外接口”,哪些是“内部实现”。
  • Python 解释器在运行时动态加载模块,会缓存到 sys.modules 中,效率高、灵活性强。

优点:组织方式灵活,既可以面向过程(只用函数),也可以面向对象(类、方法)。

缺点:访问控制靠约定(下划线命名),不是强制性的。


3. Java:纯面向对象 + 严格接口
  • 一切功能都在类中封装,通过对象和方法调用。
  • import 是告诉编译器/IDE你要用哪个包里的类,JVM 在运行时加载 .class 文件。
  • 有明确的访问修饰符:publicprivateprotected,配合 interfaceabstract 保证了模块之间只能通过“黑盒”方式调用。
  • 强调文档化(JavaDoc),接口设计尽可能稳定,方便多人协作和大型项目维护。

优点:封装严格,依赖清晰,便于大型工程合作。

缺点:灵活性相对较低,不允许你随便“越界”访问实现细节。

举个例子:你要计算平方根

  • C语言:使用 sqrt(),要链接 math 库
  • Python:import math 后直接用 math.sqrt()
  • Java:用 Math.sqrt(),它是标准类库中静态方法的一部分

注:读到这里你有没有联想到函数?函数与这三者的本质一样吗?

答案是:是的,本质一样,都是封装好的功能单元的调用

  • 自己写的函数:是你自己封装的功能逻辑
  • 库函数/API:是别人写好的封装逻辑,你通过调用接口使用

它们的区别只是:

维度自己写的函数库函数 / 模块 / API
实现者你自己第三方/语言标准库
可控性高(可改)低(只调用)
抽象层次局部封装系统/模块级封装

可以说,从函数 → 模块 → API,是功能封装粒度越来越大的过程。

通俗理解:不同“买菜方式”

可以用一个比喻来形象地理解它们:

  • C语言像超市自己搬货:你去超市买东西,得知道哪个货架在哪,手动挑选并结账(头文件 + 链接库)。
  • Python像点外卖:你说“我要牛奶”,平台自动给你送来,不用关心它从哪来的(解释器动态导入模块)。
  • Java像公司采购:你申请一份需求,走审批流程,用标准接口对接供应商(类与接口,编译与JVM约束更严格)。

四、统一视角下的“调用模型”

JAVA、C、Python 是这样。那么我们格局打开:抽象所有调用方式,可以看到一个共同模型:

[调用者] ——(通过接口)——> [被调用者的封装逻辑]

这个模型不依赖语言,不依赖调用方式。只要满足:

  • 清晰的调用入口(接口、函数、方法)
  • 明确的封装边界(实现不可见)
  • 调用和被调用的分离(你调用的是“黑盒”)

那它就是一种“统一的调用机制”。是不是豁然开朗捏~

五、总结升华

​ 可能我的这篇博客在资深程序员看来,像极了在论证一个已知的常识。就像我写了2k字在论证人活着要呼吸一样。其实我的这个思考对于我自身来说是有很大意义的,也可以算个进步的开始,开始有想法了。学编程不只是会用语言,而是在理解语言的“灵魂”——这才是编程真正的魅力所在。最后用一句话作为结尾,送给我,也送给不断攀登的年轻人:

​ 青年人的血液应该是液态阳光!

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

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

相关文章

基于NCNN框架在Android平台实现YOLOv8目标检测模型的高效部署与实践

随着移动设备计算能力的提升&#xff0c;越来越多的深度学习模型被部署到移动端&#xff0c;以实现实时、低延迟的应用场景。YOLO系列的在目标检测任务中表现出色&#xff0c;具有精度高、速度快的优势。本文将详细介绍如何基于NCNN框架 &#xff0c;在Android平台 上高效部署Y…

华为动态路由配置

问题描述&#xff1a;针对四个路由器在不同的网段场景中&#xff0c;对四个路由器进行动态路由配置。下面以如下场景为例&#xff0c;介绍详细配置过程。配置过程&#xff1a; 1、每个路由器的接口配置IP地址 路由器AR1中每个接口配置IP地址。 sys # 进入系统视图 interface g…

分布式事务解决方案(三)

在Java分布式系统领域&#xff0c;传统强一致性方案&#xff08;如2PC、3PC&#xff09;在高并发、复杂业务场景下暴露出性能瓶颈和阻塞问题。而Saga模式与事件溯源&#xff08;Event Sourcing&#xff09;作为更具弹性和扩展性的解决方案&#xff0c;逐渐成为分布式事务处理和…

【时时三省】(C语言基础)通过指针引用数组

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省数组元素的指针一个变量有地址&#xff0c;一个数组包含若干元素&#xff0c;每个数组元素都在内存中占用存储单元&#xff0c;它们都有相应的地址。指针变量既然可以指向变量&#xff0c;当然…

【WEB】Polar靶场 21-25题 详细笔记

二十一.php very nicephp又是你 ,但是经过这么多次折磨后我感觉我已经有一点抗性了老规矩&#xff0c;先看知识点PHP 序列化是将 PHP 变量&#xff08;如对象、数组&#xff09;转换为字符串的过程&#xff0c;便于存储或传输。反序列化则是将字符串还原为原始变量。这在缓存、…

【Guava】1.0.设计虚拟机的方向

【Guava】1.0.设计虚拟机的方向虚拟机是什么&#xff1f;栈式虚拟机栈式虚拟机的优缺点题外话虚拟机是什么&#xff1f; 虚拟机&#xff08;VirtualMachine, VM&#xff09;是一种计算机程序或系统&#xff0c;它通过软件模拟物理计算机的硬件运行环境&#xff0c;使得多个操作…

[附源码+数据库+毕业论文]基于Spring+MyBatis+MySQL+Maven+jsp实现的高校实验室资源综合管理系统,推荐!

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本高校实验室资源综合管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大…

Spring Boot:影响事务回滚的几种情况

一、Controller 捕获异常导致事务失效 需求 我们有一个用户注册服务&#xff0c;注册时需要&#xff1a; 创建用户账户分配初始积分发送注册通知 这三个操作需要在同一个事务中执行&#xff0c;任何一步失败都要回滚。 错误示例&#xff1a;Controller 捕获异常导致事务失效 Re…

如何避免分布式爬虫被目标网站封禁?

在分布式爬虫的大规模数据采集场景中&#xff0c;避免被目标网站封禁的核心逻辑是&#xff1a;通过技术手段模拟真实用户行为&#xff0c;降低爬虫行为的可识别性&#xff0c;同时建立动态适配机制应对网站反爬策略的升级。以下从请求伪装、行为控制、资源管理、反爬对抗四个维…

Maven 打包排除特定依赖的完整指南(详细方法 + 示例)

前言 在使用 Maven 构建 Java 项目时&#xff0c;我们常常需要对项目的打包过程进行精细化控制&#xff0c;尤其是希望排除某些特定的依赖库。这可能是为了减小最终构建产物的体积、避免版本冲突&#xff0c;或者仅仅是为了满足不同环境下的部署需求。 本文将详细介绍如何在 Ma…

Terraform `for_each` 精讲:优雅地自动化多域名证书验证

大家好&#xff0c;在云原生和自动化运维的世界里&#xff0c;Terraform无疑是基础设施即代码&#xff08;IaC&#xff09;领域的王者。它强大的声明式语法让我们能够轻松地描述和管理云资源。然而&#xff0c;即使是经验丰富的工程师&#xff0c;在面对某些动态场景时也可能会…

C++标准库中各种互斥锁的用法 mutex

示例 仅供参考学习 #include <mutex> #include <shared_mutex> #include <thread> #include <chrono> #include <iostream> #include <vector>// // 1. std::mutex - 基本互斥锁 // void basic_mutex_example() {std::mutex mtx;int cou…

Android Handler机制与底层原理详解

Android 的 Handler 机制是跨线程通信和异步消息处理的核心框架&#xff0c;它构成了 Android 应用响应性和事件驱动模型的基础&#xff08;如 UI 更新、后台任务协调&#xff09;。其核心思想是 “消息队列 循环处理”。 核心组件及其关系Handler (处理器): 角色: 消息的发送…

jQuery JSONP:实现跨域数据交互的利器

jQuery JSONP&#xff1a;实现跨域数据交互的利器 引言 随着互联网的发展&#xff0c;跨域数据交互的需求日益增加。在Web开发中&#xff0c;由于同源策略的限制&#xff0c;直接通过XMLHttpRequest请求跨域数据会遇到诸多问题。而JSONP&#xff08;JSON with Padding&#xff…

Redis集群和 zookeeper 实现分布式锁的优势和劣势

在分布式系统中&#xff0c;实现分布式锁是确保多个节点间互斥访问共享资源的一种常见需求。Redis 集群 和 zookeeper 都可以用来实现这一功能&#xff0c;但它们有着各自不同的优势和劣势。 CAP 理论&#xff1a; 在设计一个分布式系统时&#xff0c;一致性&#xff08;Consis…

如何备份vivo手机中的联系人?

随着vivo移动设备在全球设立7个研发中心&#xff0c;vivo正在进入更多的国家。如今&#xff0c;越来越多的人开始使用vivo手机。以vivo X100为例&#xff0c;它配备了主摄像头和多个辅助摄像头&#xff0c;提供多样化的拍摄选项&#xff0c;并搭载了最新的FunTouch OS&#xff…

python脚本编程:使用BeautifulSoup爬虫库获取热门单机游戏排行榜

BeautifulSoup是一个便捷的解析html页面元素的python库&#xff0c;此处用来写一个简单的爬虫批量抓取国内游戏资讯网站的近期热门单机游戏排行榜。 网页来源如下所示代码 from bs4 import BeautifulSoup import requests# get web page web_url "https://www.3dmgame.co…

C#配置全面详解:从传统方式到现代配置系统

C#配置全面详解&#xff1a;从传统方式到现代配置系统 在软件开发中&#xff0c;配置是指应用程序运行时可调整的参数集合&#xff0c;如数据库连接字符串、API 地址、日志级别等。将这些参数从代码中分离出来&#xff0c;便于在不修改代码的情况下调整应用行为。C# 提供了多种…

数据中台架构解析:湖仓一体的实战设计

目录 一、数据中台与湖仓一体架构是什么 1. 数据中台 2. 湖仓一体架构 3. 湖仓一体在数据中台里的价值 二、湖仓一体架构的核心部件 1. 数据湖 2. 数据仓库 3. 数据集成工具 4. 数据分析与处理引擎 三、湖仓一体架构实战设计 1. 需求分析与规划 2. 数据湖建设 3. …

SQL Server表分区技术详解

表分区概述 表分区是将大型数据库表物理分割为多个较小单元的技术,逻辑上仍表现为单一实体。该技术通过水平分割数据显著提升查询性能,尤其针对TB级数据表可降低90%的响应时间。典型应用场景包含订单历史表、日志记录表等具有明显时间特征的业务数据,以及需要定期归档的审计…