二、Java面向对象(7)_封装思想——import关键字

时间:2022-02-17 21:56:45

2018-04-30

 

import关键字

 

 

import导入声明可分为两中: 
  1>单类型导入(single-type-import) ,只能导入某一个类

    语法格式:import 类的全限定名;

    例:import java.util.ArrayList; 
  2>按需类型导入(type-import-on-demand) ,表示导入该包下当前文件夹所有使用到的

    语法格式:import 包名.字包名.*;
    例:import java.util.*;

    在Eclipse工具中,即使使用*导入,在格式化代码的时候也会转换成N条import语句

 

以这样两种方式导入包中的任何一个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.liang中寻找使用到的类,比如String,System等,所以他们不需要导入。(推论:除了java.liang的包,都需要导入。)

-----------------------------------------------------------------

 

使用按需导入声明是否会降低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也导入,这可是在当前包中啊!