從庫函數到API接口,深挖不同語言背后的“封裝”與“調用”思想

在這里插入圖片描述

個人主頁-愛因斯晨

優秀文章推薦

文章目錄

    • 個人主頁-愛因斯晨
    • 優秀文章推薦
    • 引言
    • 一、三種調用機制概述
      • 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%的響應時間。典型應用場景包含訂單歷史表、日志記錄表等具有明顯時間特征的業務數據,以及需要定期歸檔的審計…