书上有这么句话:java允许使用包(package)将类组织起来。
我目前写的类都是写在扩展名为java的文件里,看起来包的概念就是java文件。书的另一页又有这么句话:在 java.awt 包中的windows类就是一个典型的示例。
从这来看,包不是java文件。问下,包到底是什么,import 和 package 有什么区别,package 是怎么用的

解决方案 »

  1.   

    package只是为了区别重名问题就像文件夹一样,不同的文件夹下面的文件可以取相同的名字
    你所说的java类一般都是分类放在包下
    java类中的import是指在类中有的方法啊什么的需要调用到jar中封装好的方法或是自己写的其它包中的方法,这时候就要把它们import进来
      

  2.   

    package就是为了寻找类,防止命名冲突的。
      

  3.   

    import是个动词 意思是引入
    package是个名词 意思是包 
      

  4.   


    package,import,include的联系与区别
    有些人写了一阵子 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.*; 
    多次导入,也可编译通过.编译器会将冗余导入声明忽略. 这是否意味着你总是可以使用按需导入声明?是,也不是! 
    在类似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也导入,这可是在当前包中啊!  
      

  5.   

    最直接的问题:假如你现在有两个Hello.java,当然了是在不同的目录结构下。你现在要运行Hello    你怎么确定是运行的那一个列?  你是不是会带上路径?    包:实际上就是以项目根结点为起点的,类全路径