有些人写了一阵子 Java,可是对於 Java 的 package 跟 import 还是不 
太了解很多人以為原始码 .java 档案中的 import 会让编译器把所 import 
的程式通通写到编译好的 .class 档案中,或是认為 import 跟 C/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.InputStream is = 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 就是在程式一开头的时候,先说明程式中会用到那些类别的简称,也就是只称呼名字,不称呼他的姓。首先,在档案开头写:

import java.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 又提供了一个方法:

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

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

import java.*;

歷史告诉我们,人可以懒,但不能太懒,这样是不行的。因為那些类别是姓 
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) 
例:import java.util.ArrayList; 
2>按需类型导入(type-import-on-demand) 
例:import java.util.*;

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

*导入声明仅导入类型而不导入子包;这就是为什么称它们为单类型导入和按需类型导入声明的原因.

*导入的类或接口的简名(simple name)具有编译单元作用域.这表示该类型简名可以在导入语句所在的编译单元的任何地方使用.这并不意味着你可以使用该类型所有成员的简名,而只能使用类型自身的简名. 
例如: java.lang包中的public类都是自动导入的,包括Math和System类.但是,你不能使用简名PI()和gc(),而必须使用Math.PI()和System.gc().你不需要键入的是java.lang.Math.PI()和java.lang.System.gc().

程序员有时会导入当前包或java.lang包,这是不需要的,因为当前包的成员本身就在作用域内,而java.lang包是自动导入的.java编译器会忽略这些冗余导入声明(redundant import declarations).即使像这样 
import java.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也导入,这可是在当前包中啊!

参考资料:http://xgtian.blog.51cto.com/3844449/737269

转载于:https://www.cnblogs.com/ECJTUACM-873284962/p/7441323.html

Java中import及package的用法相关推荐

  1. java中import用法

    java中import用法 单类型导入(single-type-import),例如import java.io.File; 按需类型导入(type-import-on-demand),例如 impo ...

  2. Java中BigDecimal类介绍及用法

    Java中BigDecimal类介绍及用法 Java中提供了大数字(超过16位有效位)的操作类,即 java.math.BinInteger 类和 java.math.BigDecimal 类,用于高 ...

  3. Java中栈和队列的用法 Stack And Queue

    Java中栈和队列的用法 栈的实现 使用Java的集合类Stack boolean isEmpty();//判断当前栈是否为空,等价于empty(); synchronized E peek();// ...

  4. java drawstring字体大小,JAVA中,drawstring 方法的用法,格式是什么啊

    啦啦啦额68的回答 Java中Graphics类的drawString()方法: i)drawString(String str,int x,int y): String str是可以在屏幕上显示的字 ...

  5. java中的Queue队列的用法

    大家好,欢迎来到雄雄的小课堂,今天给大家分享的是"java中的Queue队列的用法" 前言:好多人对Queue不是很熟悉,毕竟平时也不怎么用,遇到集合要么List要么map这些常用 ...

  6. Java中import语句的作用

    Java中import语句的作用 为了能够使用某一个包的成员,我们需要在 Java 程序中明确导入该包.使用"import"语句可完成此功能.在 java 源文件中 import ...

  7. 【Java学习笔记之二十九】Java中的equals和==的用法及区别

    Java中的"equals"和"=="的用法及区别 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String(&quo ...

  8. Java中PreparedStatement和Statement的用法区别

    Java中PreparedStatement和Statement的用法区别 (2012-08-01 11:06:44) 转载▼ 标签: 杂谈   1. PreparedStatement接口继承Sta ...

  9. Java中static的含义和用法

    Java中static的含义和用法 static:静态的,用于修饰成员(成员变量,成员方法); 1.被static所修饰的变量或者方法会储存在数据共享区; 2.被static修饰后的成员变量只有一份! ...

最新文章

  1. 常用16 个 Linux 服务器监控命令
  2. 每日一皮:学会说话很重要...
  3. 【408预推免复习】计算机组成原理之指令系统
  4. 【深度学习】孪生网络(Siamese Network)的模式和训练过程
  5. 最短路径问题-Dijkstra算法的python实现
  6. UNIX下的环境变量--转载
  7. python机制_python异常机制个人理解(参考网上资料)
  8. NSAttributedString
  9. “中序表达式”转换为“前序表达式”、“后序表达式”
  10. PyQt4 的事件与信号 -- 发射信号
  11. 20春学期《计算机应用基础》在线作业2,东大20春学期《计算机应用基础》在线平时作业2答案...
  12. 《构建之法》读书心得
  13. sketchup作品_建环学院学生期末作品展第六站计算机辅助设计sketchup作业
  14. 【企业架构】什么是数据架构? 管理数据的框架
  15. matlab 指数函数拟合,[转载]MATLAB数据拟合例子(一次函数、指数函数、双曲线)...
  16. multisim虚拟电子实验室安装包及汉化包(百度网盘地址)
  17. CTF新手抓包找flag
  18. [鸿篇巨制]蚂蚁金融级分布式架构SOFAStack编年史
  19. 159.Vue实现个人博客(七)【Vue2.0-路由参数】 2019.03.15
  20. 认认真真学习STL之string

热门文章

  1. GitHub的AI写代码翻车了,会在注释里给你写上what the f***,因为...
  2. 小白都能看得懂的java虚拟机内存模型
  3. 8种方案解决重复提交问题
  4. 尹伊:Datawhale做的一件事
  5. 我的4年学习心得:AI 应该是一个整体!
  6. 数据项目总结:王者荣耀总决赛预测!
  7. 【廖雪峰python入门笔记】dict
  8. 高校分配男朋友?当专业第一遇到了专业第一......
  9. 最新!TUI世界大学排名(2021)发布:清华位居全球前20名!
  10. 超越卷积、自注意力机制:强大的神经网络新算子involution