资讯专栏INFORMATION COLUMN

当我#include或import的时候,我到底干了什么?

HmyBmny / 3447人阅读

摘要:事实上,的作用是在写程序的时候,不用把类或者变量的长长的全名打出来。为了避免与其他下的类混淆,它有一个全名是。这就是的作用了。同样,每个文件的第一句是告诉编译器,我这个类是在这个下面的。

C语言中的#include

学习C语言的时候,大家都写过这么一个hello world

#include 
int main()
{
    printf("hello, world");
    return 0;
}

但如果没有第一句#include ,编译是通不过的
因为printf这个函数没有被声明,因为C语言要求,函数必须先声明再调用

事实上,#include 所做的仅仅是把stdio.h这个文件给包括进来了,就像你找到stdio.h文件,并把所有内容复制到main函数的前面,效果是完全一样的。

stdio.h包括的是对C语言标准库中一系列函数的声明(当然也有printf的),通常它在你的编译器安装位置的include目录下。编译器是会默认的去这个目录寻找你include的文件的。

所以,#include 之后,程序就能编译通过了。而printf的实现在C语言标准库libc.a中,标准库的实现是会被编译器自动链接进你的程序的。

知道了原理,我们有另一种方式去成功的调用printf函数,那就是自己声明它。

int printf(const char *format, ...);
int main()
{
    printf("hello, world");
    return 0;
}

相信我,这个程序也是能编译成功而且输出正确结果的,因为第一句话和#include 的目的是一样的,只不过是仅仅声明了其中一个函数而已。

Java中的import

如果你以为import#include一样是把整个文件包含进来,那就错了。事实上,import的作用是在写程序的时候,不用把类或者变量的长长的全名打出来。

说到这里,不得不说一下Java组织源代码的方式。
Java的每个public的类都是一个文件,它位于某个package之中,而package则是许多文件夹构成的一个路径。

如下图,假设我的Java工程的源代码都在src文件夹下,cc.chenjr.mypackage就是一个package(注意它实际上就是文件夹),MyClass是这个package下的一个类。

src
└── cc
    └── chenjr
        └── mypackage
            └── MyClass.java

为了避免与其他package下的MyClass类混淆,它有一个全名是cc.chenjr.mypackage.MyClass。比如System的全名是java.lang.System。我们不用去import java.lang.System是因为编译器帮我们做了这件事。

那在别的文件中要用cc.chenjr.mypackage.MyClass的时候,打全名实在太麻烦,所以我们就告诉编译器,我这个文件里的MyClass就是cc.chenjr.mypackage.MyClass而不是其他的MyClass。这就是import的作用了。

同样,每个.java文件的第一句package cc.chenjr.mypackage;是告诉编译器,我这个类是在这个package下面的。如果这个类的文件被移动到别的文件夹下,是编译不了的。

当然,如果我们非要用到两个MyClass,其中有一个就不得不打全名了,比如这样,假设我自己有和Java库中名字冲突的类并import了它们,我想用Java的标准库的类就只能打全名了。

package cc.chenjr.mypackage;
import cc.chenjr.mypackage.List;
import cc.chenjr.mypackage.ArrayList;

public class Test {
    public static void main(String[] args) {
        java.util.List list = new java.util.ArrayList();
    }
}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/64197.html

相关文章

  • pygame.error: font not initialized解决及init()到底干了什么

    摘要:结果在安装完之后,安装也要安装之后,运行常规的测试函数返回的数字是,排除问题的方法就是把已知可以的子模块都先运行掉。说了这么多,它到底了哪些子模块我把官网上面的里介绍的所有带有的子模块都运行了一遍。 环境Python3.6.8pygame1.9.4 贴上报错源码: import pygame my_font = pygame.font.SysFont(arial, 16) my_fon...

    yunhao 评论0 收藏0
  • Python工具分析风险数据

    摘要:小安分析的数据主要是用户使用代理访问日志记录信息,要分析的原始数据以的形式存储。下面小安带小伙伴们一起来管窥管窥这些数据。在此小安一定一定要告诉你,小安每次做数据分析时必定使用的方法方法。 随着网络安全信息数据大规模的增长,应用数据分析技术进行网络安全分析成为业界研究热点,小安在这次小讲堂中带大家用Python工具对风险数据作简单分析,主要是分析蜜罐日志数据,来看看一般大家都使用代理i...

    Berwin 评论0 收藏0
  • JavaScript 中 new 到底干了什么,跟原型链又有一些什么联系?

    摘要:原文如果按面向对象的思路去讲的,还是很难去理解,我们可以从另一个方向去理解一下它。 原文:https://legacy.ofcrab.com/press/javascript-new.html 如果按面向对象的思路去讲 JavaScript 的 new,还是很难去理解,我们可以从另一个方向去理解一下它。 你这些人类 我是一名程序员,也是一个人,我可能: 有一个响亮亮的名称 在某一天出...

    Cympros 评论0 收藏0
  • "php artisan serve"到底干了什么

    摘要:最近看了一下这个框架,写点东西当个笔记。函数会迭代属性为的,逐一将其注册,的方法继承自父类,关键的就是在这个里注册的。 最近看了一下 laravel 这个框架,写点东西当个笔记。跟着官网上的说明 install 好一个项目后,在项目根目录执行命令php artisan serve就可以开启一个简易的服务器进行开发,这个命令到底做了什么,看了一下代码,在这里简要描述一下自己的看法。 先说...

    TANKING 评论0 收藏0

发表评论

0条评论

HmyBmny

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<