Java中的Import语句如何理解?

灵动代码樵夫 2013-03-19 03:43:51
在学习C/C++时有#include<>之类的语句,我知道这是在编译进预处理程序会将<>中的.h文加载进来,再进行编译。用gcc编译成中间文件,然后打开这个中间文件看时,确实没有了#include<>语句,而代替成了.h文件的内容。

我不明白Java中的import语句在编译成.class文件时它还存在不?若不存在它在整个编译过程中起什么作用?
...全文
933 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
sunny8675 2013-03-21
  • 打赏
  • 举报
回复
通俗的说,假如你要去做饭,就得需要锅碗瓢盆吧,做啥饭用啥工作。 java中import就相当于你需要用什么工具 ,得先拿来才能用。
灵动代码樵夫 2013-03-21
  • 打赏
  • 举报
回复
引用 11 楼 Njdezhang 的回复:
引用 6 楼 Smart_yujin 的回复:java的编译和链接是在jvm里完成的?这句够我吃几顿的了!可以再送一程吗?就是详细说说!谢谢! 前面说的java的编译,这里纠正一下,我是参照c++将源文件编译成机器码这个过程而言,也就是说,我前面说的java编译是特指转换成机器码这个过程。 1,java为了屏蔽平台无关性而使用了java虚拟机,而虚拟机本身是与……
太给力了,四点内容,句句震撼人,句句是精髓,太感谢了!
yueting123 2013-03-21
  • 打赏
  • 举报
回复
引用 1 楼 abcmsnet 的回复:
和net里using System;一个意思 基本就是你编译本Class使用了另外一个类里的一些方法,你编译成了class他肯定是存在的。你打包发布后他也一起打包出去了。
请教一个问题,函数摘要是指什么?
shine333 2013-03-21
  • 打赏
  • 举报
回复
java的import,C#的using,都只是命名空间而已 比如Date的全名是java.util.Date,ArrayList的全名是java.util.ArrayList,如果代码里面到处都写xxx.yyy.Zzz,非常累赘。 为了方便,引入命名空间的概念。只要import java.util.ArrayList或者import java.util.*; 在这个.java文件里面,只要挟ArrayList即可,编译器编译的时候,自动会识别并编译为java.util.ArrayList。
tangwq121 2013-03-21
  • 打赏
  • 举报
回复
其实就是告诉编译器一个目录位置,方便找得到
cinocxh 2013-03-21
  • 打赏
  • 举报
回复
import 就是指 当你需要用到一些类的时候,告诉你的程序从import所指的地方去找。
Njdezhang 2013-03-20
  • 打赏
  • 举报
回复
引用 6 楼 Smart_yujin 的回复:
java的编译和链接是在jvm里完成的?这句够我吃几顿的了!可以再送一程吗?就是详细说说!谢谢!
前面说的java的编译,这里纠正一下,我是参照c++将源文件编译成机器码这个过程而言,也就是说,我前面说的java编译是特指转换成机器码这个过程。 1,java为了屏蔽平台无关性而使用了java虚拟机,而虚拟机本身是与平台有关的,就是我们平时看到的windows版本和linux版本而且还有32位和64位之分,但作为一个开发者,我们写代码时很少考虑到这些。 2,正是由于要经历虚拟机,所以java的编译可以看作分为两个步骤进行:前端编译(javac)和后端编译(JIT)。当然现在也有一步到位的编译器。 3,我们通常所说的java编译大多是指前面编译,也就是前面提到的,将java源文件转换成jvm规范的一种格式,虽然它也是二进制的,但是它只能被虚拟机所识别。但是我们知道,java虚拟机其实并不是只能执行由java语言写成的代码,它也可以执行groovy, jpython这样的语言写成的源码,这些源码都会经历前端编译。前面编译不会做链接工作,它只是进行语法检查和格式转换。 4,早期的虚拟机会以解释执行的方式来执行代码,我们都知道,解释执行的性能是没有编译执行快的,这也是为什么总是说java慢的原因。后来java加入即时编译器(JIT)使得java可以以解释执行和编译执行两种方式来执行代码。这一阶段,我们可以称之为后端编译。在这个时候,虚拟机将class文件编译成机器码,并链接其它文件。 所以从这个角度来看,import在前端编译时,不会做什么实质性的事情,只是一个标识而已。在后端编译时,虚拟机会根据所需要的类优化导入,据说JIT可以在运行进搜集到更多的信息从而可以编译出在性能上可以达到甚至超过c++的机器码。
少主无翼 2013-03-20
  • 打赏
  • 举报
回复
个人认为在编译成.class文件的时候并没有将import需要引入的类或者包直接添加到.class文件中,而是依旧使用import标识,也就是此时的.class文件执行依旧依赖于import引入的类或者包,你想一下一个类会使用import引入多少类,而且我们通常使用import的时候会直接引入一个包,这样的话要是在编译成.class文件时将这些依赖的类添加到文件中就会使得文件过大,占用太多空间,同时jvm在加载这些.class文件的时候也会很麻烦,所以明智的作法就是在编译的时候不添加依赖的类,而是在jvm加载的时候将这些依赖一同加载进来,进行执行 个人拙见
Loolan 2013-03-20
  • 打赏
  • 举报
回复
个人理解:A include B。A会把整个B的文件的内容包含进来。A文件的大小会增加。而import在编译后的class文件里会有记录,但不是引入(import)所有的类到class文件里。import告诉编译器要使用的类所在的位置。
biany2 2013-03-20
  • 打赏
  • 举报
回复
引用 5 楼 Njdezhang 的回复:
个人理解: 1,class只是一个中间码,用来屏蔽平台无关的,所以他只是把源文件转换成了一种体积较小,符合jvm规范的一种格式,所以在class文件中,import存在的。 2,java的编译和链接是在jvm里完成的,jvm本身是用c(还是c++的我不清楚)编写的,当class文件装入jvm后,执行编译链接,过程可等同于c++
别看WO太多 2013-03-20
  • 打赏
  • 举报
回复
肯定存在啊,.class文件相当于可执行文件了,运行时JVM把.class文件加载到内存,执行,所以说,import引入的类肯定在的。
灵动代码樵夫 2013-03-20
  • 打赏
  • 举报
回复
java的编译和链接是在jvm里完成的?这句够我吃几顿的了!可以再送一程吗?就是详细说说!谢谢!
Njdezhang 2013-03-19
  • 打赏
  • 举报
回复
个人理解: 1,class只是一个中间码,用来屏蔽平台无关的,所以他只是把源文件转换成了一种体积较小,符合jvm规范的一种格式,所以在class文件中,import存在的。 2,java的编译和链接是在jvm里完成的,jvm本身是用c(还是c++的我不清楚)编写的,当class文件装入jvm后,执行编译链接,过程可等同于c++
灵动代码樵夫 2013-03-19
  • 打赏
  • 举报
回复
可以从编译和连接的角度解释下这个import吗?
一叶飞舟 2013-03-19
  • 打赏
  • 举报
回复
导入需要的类库,一些已经编译过的class文件
nai598455803 2013-03-19
  • 打赏
  • 举报
回复
大概就是导入包,包中的类和方法
  • 打赏
  • 举报
回复
和net里using System;一个意思 基本就是你编译本Class使用了另外一个类里的一些方法,你编译成了class他肯定是存在的。你打包发布后他也一起打包出去了。

67,523

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧