java中import,package的用法

有些人写了一阵子 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也导入,这可是在当前包中啊!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,230评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,261评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,089评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,542评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,542评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,544评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,922评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,578评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,816评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,576评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,658评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,359评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,937评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,920评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,859评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,381评论 2 342

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,580评论 18 139
  • 前言 人生苦多,快来 Kotlin ,快速学习Kotlin! 什么是Kotlin? Kotlin 是种静态类型编程...
    任半生嚣狂阅读 26,134评论 9 118
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,560评论 18 399
  • 不用上帝作证 R一直也觉得自己是个好姑娘 直到现在咳嗽发觉嗓子有痰 大腿也在走路的过程中迈不开的时候 R才意识到可...
    爱独白阅读 338评论 1 1
  • 肆意生长,无关其他
    R小法师R阅读 327评论 0 0