学习C语言的时候,你们都写过这么一个hello worldjava
#include <stdio.h> int main() { printf("hello, world"); return 0; }
但若是没有第一句#include <stdio.h>
,编译是通不过的
由于printf这个函数没有被声明,由于C语言要求,函数必须先声明再调用函数
事实上,#include <stdio.h>
所作的仅仅是把stdio.h这个文件给包括进来了,就像你找到stdio.h文件,并把全部内容复制到main函数的前面,效果是彻底同样的。学习
stdio.h包括的是对C语言标准库中一系列函数的声明(固然也有printf的),一般它在你的编译器安装位置的include目录下。编译器是会默认的去这个目录寻找你include的文件的。code
因此,#include <stdio.h>
以后,程序就能编译经过了。而printf的实如今C语言标准库libc.a中,标准库的实现是会被编译器自动连接进你的程序的。orm
知道了原理,咱们有另外一种方式去成功的调用printf函数,那就是本身声明它。编译器
int printf(const char *format, ...); int main() { printf("hello, world"); return 0; }
相信我,这个程序也是能编译成功并且输出正确结果的,由于第一句话和#include <stdio.h>
的目的是同样的,只不过是仅仅声明了其中一个函数而已。io
若是你觉得import
跟#include
同样是把整个文件包含进来,那就错了。事实上,import
的做用是在写程序的时候,不用把类或者变量的长长的全名打出来。编译
说到这里,不得不说一下Java组织源代码的方式。
Java的每一个public的类都是一个文件,它位于某个package之中,而package则是许多文件夹构成的一个路径。form
以下图,假设个人Java工程的源代码都在src文件夹下,cc.chenjr.mypackage就是一个package(注意它实际上就是文件夹),MyClass是这个package下的一个类。class
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(); } }