Java中的Import和Pacakge作用生动详解(感觉python中的import作用差不多)

转载 2012年03月30日 14:00:11

转自:http://apps.hi.baidu.com/share/detail/6510541

有些人写了一阵子 Java,可是对於 Java package import还是不太了解很多人以為原始码 .java档案中的 import会让编译器把所 import的程式通通写到编译好的 .class档案中,或是认為 importC/C++#include相似,实际上,这是错误的观念。

让我们先了解一下,Java package到底有何用处。其实,package名称就像是我们的姓,而 class名称就像是我们的名字。package名称有很多的,就好像是复姓。比如说 java.lang.String,就是复姓 java.lang,名字為String的类别;java.io.InputStream则是复姓java.io,名字為InputStream的类别。

Java会使用 package这种机制的原因也非常明显,就像我们取姓名一样,光是一间学校的同一届同学中,就有可能会出现不少同名的同学,如果不取姓的话,那学校在处理学生资料,或是同学彼此之间的称呼,就会发生很大的困扰。相同的,全世界的 Java类别数量,恐怕比台湾人口还多,而且还不断的在成长当中,如果类别不使用套件名称,那在用到相同名称的不同类别时,就会產生极大的困扰。幸运的是,Java的套件名称我们可以自己取,不像人的姓没有太大的选择 (所以有很多同名同姓的 )如果依照 Sun的规范来取套件名称,那理论上不同人所取的套件名称不会相同 (请参阅"命名惯例"的相关文章 ),也就不会发生名称衝突的情况。可是问题来了,因為很多套件的名称非常的长,在写程式时,会多打好多字,花费不少时间,比如说:

java.io.InputStreamis = java.lang.System.in;
java.io.InputStreamReader isr= new java.io.InputStreamReader(is);
java.io.BufferedReader br = new java.io.BufferedReader(isr);

实在是不美观又麻烦。於是,Sun想了一个办法,就是import这个 import就是在程式一开头的时候,先说明程式中会用到那些类别的简称,也就是只称呼名字,不称呼他的姓。首先,在档案开头写:

importjava.lang.System;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.BufferedReader;

这几行说明了这四个姓名的类别,在程式中只用他的名字来称呼,所以当程式中提到 System就是指java.lang.System,而InputStream就是指java.io.InputStream,依此类推。於是原来的程式就变成:

InputStream= System.in;
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);

这样看起来是不是清爽多了呢?如果这些类别用的次数很多,那就更能体会到import的好处了。可是这样还是不够,因為懒是人的天性,还是会有人觉得打太多 import了也很浪费时间,於是 Sun又提供了一个方法:

importjava.lang.*;
import java.io.*;

意思就是,等一下程式中提到的没有姓名的类别,不是姓 java.lang,就是姓java.io如果这两个裡面有同样名字的类别,而不幸的你又只用名字称呼这个类别,那编译器仍然会跟你抱怨,因為它还是不知道你说的这个类别指那一个姓的类别。那可不可以再懒一点呢,只写:

importjava.*;

歷史告诉我们,人可以懒,但不能太懒,这样是不行的。因為那些类别是姓java.io而不是姓 java。就像姓『诸葛』的人应该不会喜欢你称他為『诸』先生吧。

為甚麼我一开始说 import #include不同呢?因為import的功能到此為止,它不像 #include一样,会将档案内容载入进来。import只是请编译器帮你打字,让编译器把没有姓的类别加上姓,并不会把别的档案的程式码写进来。如果你想练习打字,可以不要使用 import,只要在用到类别的时候,用它的全部姓名来称呼它就行了(就像例子一开始那样),跟使用import完全没有甚麼两样。另外,虽然人不可以太懒,但是 Sun还是帮我们多偷了一点懒。因為java.lang这个套件实在是太常太常太常用到了,几乎没有程式不用它的,所以不管你有没有写 import java.lang;,编译器都会自动帮你补上,也就是说编译器只要看到没有姓的类别,它就会自动去 java.lang 裡面找找看,看这个类别是不是属於这个套件的。所以我们就不用特别去import java.lang了。

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

import导入声明可分为两中:
1>
单类型导入(single-type-import)

:importjava.util.ArrayList;
2>
按需类型导入(type-import-on-demand)

:import java.util.*;

以这样两种方式导入包中的任何一个public的类和接口(只有public类和接口才能被导入)

*导入声明仅导入类型而不导入子包;这就是为什么称它们为单类型导入和按需类型导入声明的原因. *导入的类或接口的简名(simple name)具有编译单元作用域.这表示该类型简名可以在导入语句所在的编译单元的任何地方使用.这并不意味着你可以使用该类型所有成员的简名,而只能使用类型自身的简名.例如: java.lang包中的public类都是自动导入的,包括MathSystem.但是,你不能使用简名PI()gc(),而必须使用Math.PI()System.gc().你不需要键入的是java.lang.Math.PI()java.lang.System.gc().程序员有时会导入当前包或java.lang,这是不需要的,因为当前包的成员本身就在作用域内,java.lang包是自动导入的.java编译器会忽略这些冗余导入声明(redundant importdeclarations).即使像这样importjava.util.ArrayList; import java.util.*;多次导入,也可编译通过.编译器会将冗余导入声明忽略.

使用按需导入声明是否会降低Java代码的执行效率?绝对不会! Java编译器产生的类文件仅包含编译单元实际使用到的类或接口的符号引用.

这是否意味着总是可以使用按需导入声明?,也不是!在类似Demo的非正式开发中使用按需导入声明显得很有用.然而,有这四个理由让你可以放弃这种声明:

1>  编译速度:在一个很大的项目中,它们会极大的影响编译速度.但在小型项目中使用在编译时间上可以忽略不计.

2>  命名冲突:解决避免命名冲突问题的答案就是使用全名.而按需导入恰恰就是使用导入声明初衷的否定.

3>  说明问题:全名的使用是自说性的.毕竟高级语言的代码是给人看的.

4>  无名包问题:如果在编译单元的顶部没有包声明,Java编译器首选会从无名包中搜索一个类型,然后才是按需类型声明.如果有命名冲突就会产生问题.

Sun的工程师一般不使用按需类型导入声明.这你可以在他们的代码中找到:

java.util.Properties类中的导入声明:
import java.io.IOException;
import java.io.printStream;
import java.io.printWrite;
import java.io.InputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.util.Hashtable;

你可以看到有趣的是,她连java.util.Hashtable也导入,这可是在当前包中啊!

如何理解和使用Java package包

        Java中的一个包就是一个类库单元,包内包含有一组类,它们在单一的名称空间之下被组织在了一起。这个名称空间就是包名。可以使用import关键字来导入一个包。例如使用import jav...

java中import和packages作用生动详解

转自:http://apps.hi.baidu.com/share/detail/6510541 有些人写了一阵子 Java,可是对於 Java的package 跟import还是不太了解很多人以...

java中package和import的作用

  • 2007年11月20日 13:36
  • 15KB
  • 下载

java中import作用详解

java中import详解import与package机制相关,这里先从package入手,再讲述import以及static import的作用。...

python的import __future__作用

这是 python 2 的概念,显然 python 3 对于 python2 就是 future了该句必须治愈文件的头部Python编程语言中有很多比较有用的模块,这些模块在实际使用中可以帮助我们轻松...

java import、package作用与用法

java import、package作用与用法 有些人写了一阵子 Java,可是对於 Java 的 package 跟 import 还是不 太了解很多人以為原始码 .java 档案中的 impo...

java import、package作用与用法以及与C include的区别

java import、package作用与用法 有些人写了一阵子 Java,可是对於 Java 的 package 跟 import 还是不 太了解很多人以為原始码 .java 档案中的 impo...

Java千百问_05面向对象(002)_package和import作用是什么

点击进入_更多_Java千百问1、java中package是什么即包。简单地说,它是分类class(类)与interface(接口)的方式。 在Java开发中,将会写数以百计的类和接口,因此,对它们...

java_import、package作用与用法

可是问题来了,因為很多套件的名称非常的长,在写程式时,会多打好多字,花费不少时间,比如说:          java.io.InputStream is = java.lang.System.i...

java 中的import 作用(转)

有些人写了一阵子 Java,可是对於 Java 的 package 跟 import 还是不 太了解很多人以為原始码 .java 档案中的 import 会让编译器把所 import 的程式通通写到编...
  • cyebo
  • cyebo
  • 2015年02月27日 19:12
  • 223
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java中的Import和Pacakge作用生动详解(感觉python中的import作用差不多)
举报原因:
原因补充:

(最多只允许输入30个字)