javaimport、package作用与用法.doc_第1页
javaimport、package作用与用法.doc_第2页
javaimport、package作用与用法.doc_第3页
javaimport、package作用与用法.doc_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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 is = 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.pri

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论