为啥我的Import Package里面我们的手里什么都没有有

java 中import、package作用与用法_java吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:630,943贴子:
java 中import、package作用与用法收藏
让我们先了解一下,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.&&&&& java.io.InputStreamReader isr= new java.io.InputStreamReader(is);&&&&& java.io.BufferedReader br = new java.io.BufferedReader(isr);实在是不美观又麻烦。於是,Sun 想了一个办法,就是 import。 这个 import 就是在程式一开头的时候,先说明程式中会用到那些类别的 简称,也就是只称呼名字,不称呼他的姓。首先,在档案开头写: &&&&&& import java.lang.S&&&&& import java.io.InputS&&&&& import java.io.InputStreamR&&&&& import java.io.BufferedR这几行说明了这四个姓名的类别,在程式中只用他的名字来称呼,所以当程式 中提到 System 就是指 java.lang.System,而 InputStream 就是指 java.io.InputStream,依此类推。於是原来的程式就变成: &&&&&& InputStream = System.&&&&& 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.,编译器都会自动帮你补上,也就 是说编译器只要看到没有姓的类别,它就会自动去 java.lang 里面找找看, 看这个类别是不是属於这个套件的。所以我们就不用特别去 import java.lang 了。 。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。import导入声明可分为两中: 1&单类型导入(single-type-import) 例:import java.util.ArrayL 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.ArrayL import java.util.*; 多次导入,也可编译通过.编译器会将冗余导入声明忽略. 使用按需导入声明是否会降低Java代码的执行效率?绝对不会! Java编译器产生的类文件仅包含编译单元实际使用到的类或接口的符号引用. 这是否意味着你总是可以使用按需导入声明?是,也不是! 在类似Demo的非正式开发中使用按需导入声明显得很有用. 然而,有这四个理由让你可以放弃这种声明: 1&编译速度:在一个很大的项目中,它们会极大的影响编译速度.但在小型项目中使用在编译时间上可以忽略不计. 2&命名冲突:解决避免命名冲突问题的答案就是使用全名.而按需导入恰恰就是使用导入声明初衷的否定. 3&说明问题:全名的使用是自说性的.毕竟高级语言的代码是给人看的. 4&无名包问题:如果在编译单元的顶部没有包声明,Java编译器首选会从无名包中搜索一个类型,然后才是按需类型声明.如果有命名冲突就会产生问题. Sun的工程师一般不使用按需类型导入声明.这你可以在他们的代码中找到: 在java.util.Properties类中的导入声明: import java.io.IOE import java.io.printS import java.io.printW import java.io.InputS import java.io.BufferedR import java.io.BufferedW import java.util.H 你可以看到有趣的是,她连java.util.Hashtable也导入,这可是在当前包中啊!
马克。学习了。
import 引入包
package 打包
你就ctrl c+ctrl v吧
这贴都能挖的到
。。。这都是我多久以前发的帖子了
粘贴这么多,看都看不懂
有一个math的方法,我没有导入这个包,可使用了里面的方法,结果没有报错,还可以运行,是为什么呢?
登录百度帐号推荐应用15133人阅读
由于大家对package的使用存在太多困惑,我在这里将自己对于package的使用的领悟进行一点总结:
  package中所存放的文件
  所有文件,不过一般分一下就分这三种
  1,java程序源文件,扩展名为.java。
  2,编译好的java类文件,扩展名为.class。
  3,其他文件,其他任何文件,也称为resource
  例如图片文件,xml文件,mp3文件,avi文件,文本文件……
  package是什么
  package好比java用来组织文件的一种虚拟文件系统。package把源代码.java文件,.class文件和其他文件有条理的进行一个组织,以供java来使用。package是将文件组织在一颗类似unix,linux文件系统的树结构里面,它有一个根&/&,然后从根开始有目录和文件,目录中也还有文件和目录。
  package怎么实现的呢?
  源代码的要求最严格,而一旦源代码自己声明了在哪个package路径之下,class也就有了自己在哪个package下面的信息,就是那句程序开头的&package xx.xx.xx&。有人问,为什么要有这个信息,直接放目录结构里不就好了么?是啊,直接放目录中确实可以找到.class和.java,但是如果我要输出这个.class是属于哪个package的,该怎么办?所以我们需要在.class里面留一个package的信息。如果我们要区分同样名称为A.class的类怎么办?所以我们需要在.class里面留一个package的信息。
  .java文件是一个独立的编译单元,类似c++里面的cpp文件,但是它不需要.h文件,只要.java就足够了,一个.java文件里面可以包含一个public的类,若干package类(package类特征是没有任何访问控制修饰),还有内隐类的话,则还可以包含若干protected和private的类。每个类,都会在编译的时候生成一个独立的.class文件,所以.java和.class不是一对一,而是一对多的关系,不过.java和public的类是一对一的。所有这些.class,都由这个.java开头的package语句来确定自己在package中的位置。
  package xx.bb.
  说明这个.java编译单元中的所有类都放到xx.bb.aa这个package里面。而对应的,必须把这个.java文件放在xx目录下bb目录下的aa目录里面。如果一个.java文件没有任何package语句,那么这个.java里面的所有类都在package的&/&下面,也称之为default package。可以看出你一般从任何java教科书上写的第一个hello world程序的那个类是在defaultpackage里面的。有了package语句,情况就复杂一点了。这个编译单元.java必须放在package名对应的目录之下。而生成的class文件也要放在对应的目录结构之下才能正常运作。
  例如:
&&& /* A.java */&
  package aaa.bbb.&
  public class A{&
  B b=new B();&
  /* B.java*/&
  package aaa.bbb.&
  public class B{}
  编译时候怎么填参数呢?我根据package+文件名的格式来写,
  javac aaa.bbb.ccc.A.java
  漂亮吧?可惜不工作。非要使用合法的路径名才行:
  javac aaa/bbb/ccc/A.java
  但是你发现生成的class丢失了目录结构,直接出现在当前目录下……
  最好的方式是
  javac -d bin aaa/bbb/ccc/A.java
  这样就会在当前目录的bin目录下看到完整的目录结构以及放置妥当的class文件。
  package与classpath不得不说的事
  对于java来讲,所有需要的程序和资源都要以package的形式来组织和读取。
  那么classpath又是什么呢?
  所有放到设定到classpath里面的东西就是package所包纳的资源。classpath的写法如同path,只是里面可以写的一般只有zip文件、jar文件和目录。多个元素之间用当前系统路径分隔符间隔开了,linux上分隔符号是&:&,windows上是&;&。classpath在java里面是被一个叫做classloader的东西所使用的,classloader顾名思义,就是load class用的,但它也可以load其它在package里面的东西。现在的java里面classloader是有阶层关系的,一般我们所常接触到的CLASSPATH环境变量,javac,java的-cp,-classpath参数所给的classpath信息是被appclassloader所使用的。而appclassloader其实是第三层的classloader,最高层的classloader叫做bootstrap
classloader,它不是java写的classloader,而是c++写成的,第二层叫做extclassloader,默认包纳是jre/lib/ext里面的classes目录和所有jar文件作为内容。第三层才是我们命令行参数,或者不用命令行参数,用系统环境变量指定classpath的使用者app classloader,这是最基本的java se。如果是java ee,有了服务器,容器,还有更多层的classloader,他们在app classloader的更下面,例如tomcat的某web应用程序的web-inf/lib中的jar,zip和classes目录,是app之下好几层的classloader使用的。
  你可以建立自己的classloader,都在app classloader之下,实际上tomcat本身也是这样建立classloader的。分层的目的是为了安全,试想你加入搞了一个classloader,从网络上读取class,而在里面写上格式化硬盘的代码,人家一读运行,那不就挂了,所以分层之后,首先从最高层读,没有再往下找,找到就不着了。一般java所必须的rt.jar里面的若干class,是在bootstrap classloader启动的时候读入的,而jmf使用的几个jar,是在ext classloader里面读入的。也就是说,读入这些class的时候,我们的appclassloader还在娘胎里呢,所以你在CLASS
PATH中指定rt.jar是完全愚蠢多余的。java绝对不会到这里找rt.jar,而bootstrapclassloader如果你不特别要修改,它是常量,不需要你care。
  import干吗用的?
  import只是一种让你偷点懒少打字的方法,绝对不会影响你的classpath,这点你要好好记住,没有非用import不可的理由,用了import也不会起到类似c里面嵌入某文件内容的效果,它只是一种省事的办法。不在classpath中的class,任你再import也无济于事。
  如果你不用import,你用ArrayList这个类,就需要写
  java.util.ArrayList。
  而用了import java.util.ArrayL的话
  以后代码中写ArrayList就可以了,省事。import可以使用通配符*,*代表某package下所有的class,不包括子目录。
  import java.awt.*
  不等于
  import java.awt.*
  import java.awt.event.*
  如果你要简写java.awt.event下和java.awt下的类,你不能偷懒,两个都要import
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:455279次
积分:5298
积分:5298
排名:第5000名
原创:145篇
转载:54篇
评论:92条
(1)(5)(6)(5)(5)(9)(7)(11)(2)(1)(14)(3)(1)(6)(20)(22)(7)(15)(20)(4)(5)(9)(1)(4)(6)(10)

我要回帖

更多关于 我什么都没有 陈奕迅 的文章

 

随机推荐