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也导入,这可是在当前包中啊! 

java中import、package作用和用法,布布扣,bubuko.com

时间: 2024-10-09 12:04:21

java中import、package作用和用法的相关文章

Java中volatile的作用以及用法

volatile让变量每次在使用的时候,都从主存中取.而不是从各个线程的“工作内存”. volatile具有synchronized关键字的“可见性”,但是没有synchronized关键字的“并发正确性”,也就是说不保证线程执行的有序性. 也就是说,volatile变量对于每次使用,线程都能得到当前volatile变量的最新值.但是volatile变量并不保证并发的正确性. =========================分割线1===============================

Java中static变量作用和用法详解

static表示"全局"或者"静态"的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念. 被static修饰的成员变量和成员方法独立于该类的任何对象.也就是说,它不依赖类特定的实例,被类的所有实例共享. 只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们.因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象. 用public修饰的static成员变量和成员方法本质是

java中super的作用

super()的作用 super可以用来访问超类的构造方法和被子类所隐藏的方法,如果子类中有方法与超类中的方法名称和参数相同,则超类中的方法就被隐藏起来,也就是说在子类中重载了父类中的方法. 引用父类中所隐藏的语法格式如下: super(参数列表)或super.方法名(参数列表) 下面通过代码展示一下super的用法: package cn.demo; public class Demo1 { public static void main(String[] args) { SubClass_A

关于Java中this和super的用法介绍和区别

1.this&super 什么是this,this是自身的一个对象,代表对象本身,可以理解为:指向对象本身的一个指针.当你想要引用当前对象的某种东西,比如当前对象的某个方法,或当前对象的某个成员,你便可以利用this来实现这个目的.要注意的是this只能在类中的非静态方法中使用,静态方法和静态的代码块中绝对不能出现this.his也可作为构造函数来使用.在后面可以看到 而什么是super,可以理解为是指向自己超(父)类对象的一个指针,而这个超类指的是离自己最近的一个父类.super的作用同样是可

java中静态代码块的用法 static用法详解

(一)java 静态代码块 静态方法区别一般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化,在不创建对象的情况下,其他程序来调用的时候,需要使用静态方法,这种代码是被动执行的. 静态方法在类加载的时候 就已经加载 可以用类名直接调用比如main方法就必须是静态的 这是程序入口两者的区别就是:静态代码块是自动执行的;静态方法是被调用的时候才执行的.静态方法(1)在Java里,可以定义一个不需要创建对象的方法,这种方法就是

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

Java中的"equals"和"=="的用法及区别 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String("hello"); 2 String str2 = new String("hello"); 3 System.out.println(str1==str2); 4 System.out.println(str1.equals(str2)); 为什么第4行和第5行的输出结果不一

深刻理解Java中final的作用(一):从final的作用剖析String被设计成不可变类的深层原因

声明:本博客为原创博客,未经同意,不得转载!小伙伴们假设是在别的地方看到的话,建议还是来csdn上看吧(原文链接为http://blog.csdn.net/bettarwang/article/details/26744661),看代码和提问.讨论都更方便. Java中final的作用主要表如今三方面:修饰变量.修饰方法和修饰类.以下就从这两个方面来解说final的作用.在文末从final及类的设计安全性出发,论述了Java中String为何要被设计成不可变类. 1.final修饰变量 fina

java中 this 的三种用法

Java中this的三种用法 调用属性 (1)this可以调用本类中的任何成员变量 调用方法(可省略) (2)this调用本类中的成员方法(在main方法里面没有办法通过this调用) 调用构造方法 (3)this调用构造方法只能在本构造方法中调用另一个构造方法(4)this 调用构造方法必须写在第一行 eg: 1 public class ThisDemo { 2 private int id; 3 private String name; 4 public ThisDemo(){ //(1)

Java中PreparedStatement和Statement的用法区别

Java中PreparedStatement和Statement的用法区别 (2012-08-01 11:06:44) 转载▼ 标签: 杂谈   1. PreparedStatement接口继承Statement, PreparedStatement 实例包含已编译的 SQL 语句,所以其执行速度要快于 Statement 对象. 2.作为 Statement 的子类,PreparedStatement 继承了 Statement 的所有功能.三种方法 execute. executeQuery