Python import 跟 Java import 有什么区别?

你好,我是 shengjk1,多年大厂经验,努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注!你会有如下收益:

  1. 了解大厂经验
  2. 拥有和大厂相匹配的技术等

希望看什么,评论或者私信告诉我!

文章目录

  • 一、 前言
  • 二、不同点
    • 2.1 import module or class
      • 2.1.1 Python import module
      • 2.1.2 Java import class
    • 2.2 import package
      • 2.2.1 Python import package
      • 2.2.2 Java import package
    • 3. import 时各自的解释器/编译器在做什么( 只是一个大概的过程,并不是严格正确,主要是为了方便理解 )
      • 3.1 Python
      • 3.2 Java
  • 三、相同点
  • 四、总结


一、 前言

这一篇是上一篇 关于 Python 的 import,你了解多少? 的姊妹篇。在上一篇中,我们详细论述了 Python import 关键字。本篇,将会详细比一下,两个特别有代表性的语言 Java 和 Python 中的 import 关键字同和异

二、不同点

两种语言的 import 的不同点有很多,比如:

  1. 语法:Java和Python中的import语句的语法不同。在Java中,import语句通常以import关键字开始,后面跟着要导入的类或包的全限定名。而在Python中,import语句通常以import关键字开始,后面跟着要导入的模块的名称。

  2. 编译时 vs 运行时:在Java中,import语句在编译时处理,编译器会解析导入路径、查找类文件并加载类。而在Python中,import语句在运行时处理,解释器会查找模块文件并执行其中的代码。

  3. 名称冲突解决:在Java中,如果导入的类或包的名称与当前命名空间中的其他定义冲突,必须使用完整的类名或使用import语句的全限定名来区分。而在Python中,可以使用as关键字为导入的模块或对象指定别名,以避免名称冲突。

  4. 静态绑定 vs 动态绑定:在Java中,类的导入是在编译时进行的,编译器会根据导入的类的类型进行静态绑定。而在Python中,模块的导入是在运行时进行的,解释器会根据导入的模块的名称进行动态绑定。

其他的很容易理解,这里我们重点对 第 2 和 3 条进行详细描述

2.1 import module or class

2.1.1 Python import module

在Python中,当一个模块被导入时,模块中的代码会被执行。然而,模块中的代码只会在第一次导入时执行一次。之后,如果再次导入同一个模块,Python解释器会直接使用已经加载的模块,而不会再次执行模块中的代码。

值得注意的是,如果在模块中存在全局级别的可执行语句(例如函数定义以外的代码),则在导入时会执行这些语句。因此,模块的导入可能会触发一些副作用操作,例如打印输出或初始化全局变量。

2.1.2 Java import class

在Java中,当一个类被导入时,该类的代码不会被立即执行。类的执行是在实际使用该类的时候发生的。

当导入一个类时,Java编译器会在编译阶段检查类的语法和类型,并生成或获取对应的字节码文件。这个字节码文件包含了类的定义和方法的字节码指令,但不会立即执行。

在程序运行时,当使用该类创建对象、调用方法或访问静态成员时,Java虚拟机(JVM)会加载该类的字节码文件,并根据需要执行类的代码。

需要注意的是,类的加载和初始化是按需进行的,即当第一次使用某个类时才会发生。一旦类被加载和初始化,JVM会缓存该类的Class对象,以便后续的使用。这种机制可以提高类的加载和执行的性能。

例如,假设我们有一个名为MyClass的类,并将其导入到另一个类中:

import com.example.MyClass;public class AnotherClass {public static void main(String[] args) {System.out.println("Before creating an instance of MyClass");MyClass obj = new MyClass(); // 创建MyClass的实例System.out.println("After creating an instance of MyClass");obj.someMethod(); // 调用MyClass的方法}
}

在上述代码中,当AnotherClass被执行时,会先打印Before creating an instance of MyClass,然后创建MyClass的实例,并打印After creating an instance of MyClass。这时,MyClass的构造函数会被调用。

如果MyClass中有其他静态成员或静态初始化块,它们也会在类被加载时执行一次。

总结起来,当一个Java类被导入时,类的代码不会立即执行。类的加载和初始化是在实际使用该类的时候按需发生的。类的加载和执行是由Java虚拟机(JVM)在程序运行时控制的。

2.2 import package

2.2.1 Python import package

在Python中,当导入一个包(package)时,包本身不会被执行。只有在使用该包中的模块或对象时,才会执行相应的代码

当导入一个包时,Python解释器会查找并执行该包下的__init__.py文件__init__.py文件可以包含一些初始化代码,用于设置包的环境、导入子模块或执行其他需要在导入时执行的操作。但这些代码只会在首次导入包时执行一次。

2.2.2 Java import package

在Java中,当一个包(package)被导入后,并不会立即加载和执行其中的类。类的加载和执行是在实际使用该类时进行的。

具体来说,当使用一个类时(例如创建该类的实例、调用该类的静态方法、访问该类的静态字段等),Java虚拟机(JVM)会根据需要进行类的加载和初始化操作。类的加载是指将类的字节码加载到内存中,并创建对应的Class对象。类的初始化是指执行类的静态初始化器和静态变量的赋值操作。

类的加载和初始化是按需进行的,即当第一次使用某个类时才会发生。一旦类被加载和初始化,JVM会缓存该类的Class对象,以便后续的使用。

需要注意的是,Java的类加载是按需延迟的,即在类被首次使用之前,它的加载和初始化都不会发生。这种延迟加载的机制可以提高性能,避免不必要的类加载和初始化操作。

3. import 时各自的解释器/编译器在做什么( 只是一个大概的过程,并不是严格正确,主要是为了方便理解 )

3.1 Python

在Python中,当解释器遇到import语句时,它执行以下几个步骤:

  1. 解析导入路径:解释器会解析import语句中指定的模块的路径。这个路径可以是相对路径或绝对路径,并且可以包含多个层级和包名。

  2. 查找模块:解释器会根据解析的路径查找对应的模块文件(以 .py.pyc 形式存在)。它会按照一定的搜索顺序查找模块,包括当前目录、Python标准库目录和自定义模块路径等。

  3. 编译模块:一旦找到模块文件,解释器会对模块进行编译,将其转换为字节码形式。对于首次导入的模块,解释器会生成对应的 .pyc 文件,以便提高后续导入的性能。

  4. 创建命名空间:解释器会为导入的模块创建一个独立的命名空间,用于存储模块中定义的变量、函数和类等。这样可以避免命名冲突,并允许代码通过模块名来引用其中的对象。

  5. 执行模块代码:解释器会执行模块中的代码,按照顺序执行模块中的语句和定义的函数、类等。这样,模块中的变量和函数会被加载到命名空间中,可以在代码中直接访问和使用。

  6. 返回模块对象:当模块中的代码执行完毕后,解释器会返回一个代表该模块的模块对象。这个模块对象可以被赋值给变量,以便在代码中使用模块中的功能。

需要注意的是,Python解释器在首次导入模块时,会执行模块中的代码并创建对应的命名空间。但在后续的导入过程中,解释器会直接使用已经编译和加载的模块对象,而不会再次执行模块中的代码。

总结起来,Python解释器在遇到import语句时会解析导入路径,查找并编译模块,创建命名空间,并执行模块中的代码。这样,模块中的变量、函数和类等会被加载到命名空间中,可以在代码中直接访问和使用。

3.2 Java

在Java中,import语句的作用是引入其他类或包,以便在代码中使用这些类或包中定义的功能。当Java解释器遇到import语句时,它会执行以下几个步骤:

  1. 解析import语句: Java解释器会解析import语句,获取导入的类或包的名称。例如,import java.util.ArrayList;将导入java.util包中的ArrayList类。
  2. 查找类或包: 解释器会查找导入的类或包,以确定其位置。它首先搜索Java类路径(包括标准库和自定义库),然后在指定位置查找。如果找到了类或包,解释器将继续执行下一步。否则,将会抛出ClassNotFoundExceptionNoClassDefFoundError等异常。
  3. 加载类或包: 如果找到了类或包,解释器将加载它们,同时也会创建相应的命名空间。加载过程包括加载字节码文件、验证字节码的正确性以及将字节码转换为内存中的可执行代码。如果导入的是一个包,解释器将加载包中的所有类。
  4. 建立符号引用: 解释器建立与导入的类或包的符号引用,以便在代码中引用它们。这允许你使用导入的类或包的名称而不必使用完全限定的类名。
  5. 解析符号引用: 当你在代码中使用导入的类或包时,解释器会解析符号引用,以确定它们的具体含义。例如,如果你在代码中使用ArrayList,解释器会解析它为导入的java.util.ArrayList类。

需要注意的是,import语句本身并不会导致类的加载或执行,它只是告诉解释器需要访问某个类或包。类的加载和初始化是在实际使用该类时按需发生的,如创建对象、调用方法等。

一旦类被加载和初始化,JVM会缓存该类的Class对象,以便后续的使用。这样,在多次使用同一个类时,解释器不需要重新加载和初始化,而是直接使用缓存的Class对象。

三、相同点

  1. 功能:无论是 Java 还是 Python ,import语句的主要功能都是引入其他类或模块,以便在代码中使用它们的功能。
  2. 命名空间:import语句将被导入的类或模块的定义引入到当前命名空间中,以便在代码中直接访问它们。
  3. 都是 关键字

四、总结

Python和Java作为流行的编程语言,都提供了import机制来引入外部代码模块/类。尽管在具体语法、导入时机、执行细节等方面有一定区别,但二者的import语句都具有引入外部代码、扩展功能、统一命名空间的作用,可以增强代码的模块化和可重用性。掌握import的用法对于合理组织和复用代码至关重要。

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

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

相关文章

STL——map set

文章将解决一下几个问题: 1.什么是set 2.什么是map 3.set应用场景 4.map应用场景 序列式容器和关联式容器 数据结构有序列式容器和关联式容器,序列式容器一般有vector,list,deque…,但关联式容器中就有map,关联式容器也是用来存…

23.2 微服务基础实战

23.2 微服务基础实战 课程安排1. **************************************************************************************** 课程安排 1. ****************************************************************************************

react 对Fiber架构的理解?解决了什么问题?

一、问题 JavaScript 引擎和页面渲染引擎两个线程是互斥的,当其中一个线程执行时,另一个线程只能挂起等待 如果 JavaScript 线程长时间地占用了主线程,那么渲染层面的更新就不得不长时间地等待,界面长时间不更新,会导…

Gis导航控件

收费工具,白嫖党、学生党、闹眼子党勿扰 收费金额为100元 1 概述 最近研究了一下电子海图相关内容,发现海图解析和显示相关的功能,都没有好用的开源工具… 在Gis地图显示那一块,有一个导航控件小控件,好像还没有人专门…

从前端到前端框架

原文地址:从前端到前端框架 - Pleasure的博客 下面是正文内容: 前言 这是一篇笔记,主要用于帮助刚入门Web全栈不久的同学。以及个人思路的记录整理。 如果你是一个全栈大师就可以直接跳过了。当然想加深一下理解也没有问题。 可能会较多谈谈…

《父母的觉醒》父母不是在培养一个“迷你版”的自己

简介 作者为美国哥伦比亚大学心理学博士沙法丽萨巴瑞。作者也写了《家庭的觉醒》。 作者的核心观点: 我们必须认识到,我们不是在培养一个“迷你版”的自己,而是在塑造一个具有独立特征的灵魂。正因为如此,我们必须铆足精神&#…

IDEA把中国大陆高校教育邮箱都封了?

今天本想趁着快到期前,用教育邮箱续命,没想到: 天不遂人愿!只能继续申请开源项目的许可证! 可惜了,没提交在每个月:

Linux命令-date命令(显示或设置系统时间与日期)

概要 date [OPTION]... [FORMAT] date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]主要用途 转换时间到选定的格式,默认为当前。设置系统时间。 参数 format:输出的时间格式。 format可用的转义序列如下:%% 百分号 %a 当地缩写的工…

Rockchip 有时遥控器ok键按下后不是确认功能,而是跳转下一个

问题平台描述 问题描述解决方法 郑重声明:本人原创博文,都是实战,均经过实际项目验证出货的 转载请标明出处:攻城狮2015 Platform: Rockchip OS:Android 10.1 Kernel: 4.19 问题描述 目前市面上的Allwinner amlogic rockchip在使用外接usb遥控器&#xf…

汇编语言程序设计 第3章:汇编语言程序格式

文章目录 1. 伪指令1.1 段定义伪指令1.2 段寄存器说明伪指令1.3 过程定义伪指令1.4 源程序结束伪指令 2. 变量/标号定义伪指令2.1 变量定义2. 2 标号定义2.3 表达式 3.地址计数器与对准伪指令3.1 地址计数器$3.2 对准伪指令 4. DOS功能调用4.1 DOS功能调用的一般方法4.2 常用的…

Git详细入门笔记

主要分为两个 一个是可视化软件,一个就是鼠标右键选择Git Bash 一、可视化软件 1、文件操作 点击file选项,可以选择添加clone,也可以add或者new new完文件之后,可以点击图形界面中的show in explorer,直接进入文件夹…

python垃圾回收机制

Python中的垃圾回收机制是自动的,它主要使用了引用计数来追踪和回收内存。 1、引用计数 当一个对象被创建时,就会被分配一块内存,然后将其引用计数设置为1。当另一个变量引用该对象时,引用计数就会增加1。当一个对象的引用计数变…

《数据结构》复试问答题总结

请简述深度优先遍历、广度优先遍历的基本思想?: 深度遍历是在图中先选择一个顶点,随后的每次遍历中选择与顶点相邻并且还没有遍历过的结点进行遍历,类似于树的先序遍历 广度遍历是先在图中选择一个顶点,并加入队列中&a…

基于亚马逊云EC2+Docker搭建nextcloud私有化云盘

亚马逊云科技EC2云服务器(Elastic Compute Cloud)是亚马逊云科技AWS(Amazon Web Services)提供的一种云计算服务。EC2代表弹性计算云,它允许用户租用虚拟计算资源,包括CPU、内存、存储和网络带宽&#xff0…

ES解析word内容为空的问题和直接使用Tika解析文档的方案

导言 在上一篇文章最后,我们虽然跑通了ES文件搜索的全部流程,但是仍然出现了1个大的问题:ES7.3实测无法索引docx和doc文档,content有值但是无法解析到附件成为可读的可搜索的内容,附件内容为空(附件中根本…

Sqlserver 模糊查询中文及在mybatis xml【非中文不匹配查询】N@P2问题

问题 sqlserver模糊查询或相等,两者都无法查询。 百度方案解释 Like 后的N是表示unicode字符。获取SQL Server数据库中Unicode类型的数据时,字符串常量必须以大写字母 N 开头,否则字符串将转换为数据库的默认代码页(字符集编码)&#xff0…

【源码独家】充电桩平台(四轮电动汽车 微服务 云快充协议)

文章目录 一、产品功能部分截图1.手机端(小程序、安卓、ios)2.PC端 二、小程序体验账号以及PC后台体验账号1.小程序体验账号2.PC后台体验账号关注公众号获取最新资讯 三、产品简介?1. 充电桩云平台(含硬件充电桩)&…

守护健康,从营养开始 —— 帕金森患者的饮食秘籍

亲爱的读者朋友们,您是否知道,在对抗帕金森病的道路上,正确的饮食和营养补充可以成为我们的有力盟友?今天,就让我们一起探索那些能够帮助帕金森患者改善症状、提高生活质量的营养素,开启健康生活的新篇章。…

Python数据分析-Numpy2

1.numpy读取数据 CSV:Comma-SeparatedValue,逗号分隔值文件 显示:表格状态 源文件:换行和逗号分隔行列的格式化文本,每一行的数据表示一条记录 由于csv便于展示,读取和写入,所以很多地方也是用csv的格式存储和传输中小型的数据,为了方便教学,我们会经…

PyTorch基础学习系列、深度学习基础模块、调优合集

整理了一下之前写的深度学习基础知识文章,方便浏览! 1. pytorch基础学习系列文章,里面代码和示例 《PyTorch深度学习实践》05 用PyTorch实现线性回归 《PyTorch深度学习实践》06 用PyTorch实现Logistic回归 《PyTorch深度学习实践》07加载数…