成立举世无双的包名[Java编程]
本文“成立举世无双的包名[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
大家大概已注意到这样一个事实:由于一个包永久不会真的“封装”到单独一个文件里面,它可由多个.class文件构成,所以局面大概略微有些混乱.为避免这个问题,最公道的一种做法就是将某个特定包利用的全部.class文件都置入单个目录里.也就是说,我们要操纵操作系统的分级文件构造避免呈现混乱局面.这恰是Java所采纳的办法.
它同时也办理了另两个问题:成立举世无双的包名以及找出那些大概深藏于目录构造某处的类.正如我们在第2章报告的那样,为到达这个目的,需求将.class文件的位置途径编码到package的名字里.但按照约定,编译器逼迫package名的第一部份是类成立者的因特网域名.由于因特网域名必定是举世无双的(由InterNIC保证——注释②,它掌握着域名的分配),所以假定按这一约定行事,package的名称就必定不会反复,所以永久不会碰到名称冲突的问题.换句话说,除非将自己的域名转让给其他人,并且对方也按照相同的途径名编写Java代码,不然名字的冲突是永久不会呈现的.当然,假如你没有自己的域名,那么必须创造一个非常冷僻的包名(比方自己的英文姓名),以便尽最大大概成立一个举世无双的包名.如决意发行自己的Java代码,那么激烈举荐去申请自己的域名,它所需的费用是非常低廉的.
②:ftp://ftp.internic.net
这个本领的另一部份是将package名解析成自己机械上的一个目录.这样一来,Java程序运行并需求装载.class文件的时刻(这是动态举行的,在程序需求成立属于那个类的一个对象,大概初次拜候那个类的一个static成员时),它便可以找到.class文件驻留的那个目录.
Java注释器的工作程序以下:首先,它找到环境变量CLASSPATH(将Java大概具有Java注释本领的工具——如浏览器——安装到机械中时,通过操作系统举行设定).CLASSPATH包含了一个或多个目录,它们作为一种特别的“根”利用,从这里展开对.class文件的搜索.从那个根开始,注释器会探求包名,并将每个点号(句点)替换成一个斜杠,从而生成从CLASSPATH根开始的一个途径名(所以package foo.bar.baz会变成foo\bar\baz大概foo/bar/baz;具体是正斜杠还是反斜杠由操作系统决意).随后将它们衔接到一同,成为CLASSPATH内的各个条目(进口).今后搜索.class文件时,便可从这些地方开始查找与预备成立的类名对应的名字.此外,它也会搜索一些尺度目录——这些目录与Java注释器驻留的地方有关.
为进一步理解这个问题,下面以我自己的域名为例,它是bruceeckel.com.将其反转过来后,com.bruceeckel就为我的类成立了举世无双的全局名称(com,edu,org,net等扩大名从前在Java包中都是大写的,但自Java 1.2以来,这种情形已发生了改变.目前整个包名都是小写的).由于决意成立一个名为util的库,我可以进一步地分割它,所以最后得到的包名以下:
package com.bruceeckel.util;
目前,可将这个包名作为下述两个文件的“命名空间”利用:
成立自己的包时,要求package语句必须是文件中的第一个“非注释”代码.第二个文件表面看起来是近似的://: Vector.java // Creating a package package com.bruceeckel.util; public class Vector { public Vector() { System.out.println( "com.bruceeckel.util.Vector"); } } ///:~
这两个文件都置于我自己系统的一个子目录中://: List.java // Creating a package package com.bruceeckel.util; public class List { public List() { System.out.println( "com.bruceeckel.util.List"); } } ///:~
C:\DOC\JavaT\com\bruceeckel\util
若通过它往回走,就会发现包名com.bruceeckel.util,但途径的第一部份又是什么呢?这是由CLASSPATH环境变量决意的.在我的机械上,它是:
CLASSPATH=.;D:\JAVA\LIB;C:\DOC\JavaT
可以看出,CLASSPATH里能包含大量备用的搜索途径.但是,利用JAR文件时要注意一个问题:必须将JAR文件的名字置于类途径里,而不但仅是它所在的途径.所以对一个名为grape.jar的JAR文件来说,我们的类途径需求包含:
CLASSPATH=.;D:\JAVA\LIB;C:\flavors\grape.jar
精确设置好类途径后,可将下面这个文件置于任何目录里(若在履行该程序时碰到麻烦,请拜见第3章的3.1.2小节“赋值”):
编译器碰到import语句后,它会搜索由CLASSPATH指定的目录,查找子目录com\bruceeckel\util,然后查找名称得当的已编译文件(关于Vector是Vector.class,关于List则是List.class).注意Vector和List内无论类还是需求的办法都必须设为public.//: LibTest.java // Uses the library package c05; import com.bruceeckel.util.*; public class LibTest { public static void main(String[] args) { Vector v = new Vector(); List l = new List(); } } ///:~
1. 自动编译
为导入的类初次成立一个对象时(大概拜候一个类的static成员时),编译器会在得当的目录里探求同名的.class文件(所以假如成立类X的一个对象,就应当是X.class).若只发现X.class,它就是必须利用的那一个类.但是,假如它在相同的目录中还发现了一个X.java,编译器就会对比两个文件的日期标志.假如X.java比X.class新,就会自动编译X.java,生成一个最新的X.class.
关于一个特定的类,或在与它同名的.java文件中没有找到它,就会对那个类采纳上述的处理.
2. 冲突
若通过*导入了两个库,并且它们包含相同的名字,这时会呈现什么情形呢?比方,假定一个程序利用了下述导入语句:
import com.bruceeckel.util.*;
import java.util.*;
由于java.util.*也包含了一个Vector类,所以这会造成潜在的冲突.但是,只要冲突并不真的发生,那么就不会产生任何问题——这当然是最抱负的情形,因为不然的话,就需求举行大量编程工作,防备那些大概大概永久也不会发生的冲突.
如目前试着生成一个Vector,就必定会发生冲突.以下所示:
Vector v = new Vector();
它引用的毕竟是哪个Vector类呢?编译器对这个问题没有答案,读者也不大概知道.所以编译器会报告一个错误,逼迫我们举行明确的阐明.比方,假定我想利用尺度的Java Vector,那么必须象下面这样编程:
java.util.Vector v = new java.util.Vector();
由于它(与CLASSPATH一同)完好指定了那个Vector的位置,所以不再需求import java.util.*语句,除非还想利用来自java.util的其他东西.
以上是“成立举世无双的包名[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |
- ·上一篇文章:java的switch语句
- ·下一篇文章:<b>java的包:库单元</b>
- ·中查找“成立举世无双的包名”更多相关内容
- ·中查找“成立举世无双的包名”更多相关内容