前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java基础:六、包 (1)

Java基础:六、包 (1)

作者头像
桑鱼
发布2020-03-17 16:47:12
5450
发布2020-03-17 16:47:12
举报
包:库单元

包内包含一组类,它们在单一的名字空间之下被组织在了一起。

假如我们要使用java.util包中的ArrayList类,有两种方式:

代码语言:javascript
复制
// 一种方式:用其全名java.util.ArrayList来指定
public class FullQualification{
    public static void main(String[] args){
        java.util.ArrayList list = new java.util.ArrayList();
    }
}
代码语言:javascript
复制
// 另一种方式:使用import关键字
// 如果想导入单一的类,可以在imoirt语句中命名该类,但是在java.util中的其他类仍旧是不可用的
import  java.util.ArrayList;
public class FullQualification{
    public static void main(String[] args){
        ArrayList list = new ArrayList();
    }
}

要想导入其中所有的类,只需要使用import java.util.*

之所以要导入,就是要提供一个管理名字空间的机制。所有类成员的名称都是彼此隔离的。A类中的方法f()与B类中具有相同特征标记(参数列表)的方法f()不会彼此冲突。而类名称防止冲突,是通过Java对名称空间的完全控制并为每个类创建唯一标识符组合。

当编写一个Java源代码文件时,此文件通常被称为编译单元。每个编译单元都必须有一个后缀名.java,而在编译单元内则可以有一个public类,该类的名称必须与文件的名称相同(包括大小写,但不包括文件的后缀名.java)。每个编译单元只能有一个public类,否则编译器就不会接受。如果在编译单元之中还有额外的类的化,那么在包之外的世界是无法看见这些类的,这是因为它们不是public类,而且它们主要用来为主public类提供支持

代码组织

当编译一个.java文件时,在.java文件中的每个类都会有一个输出文件,而该输出文件的名称与.java文件中每个类名相同,只是后缀为.class。因此,在编译少量.java文件之后,就得到大量的.class文件。Java可运行程序是一组可以打包并压缩为一个Java文档文件(JAR,使用Java的jar文档生成器)的.class文件。Java解释器负责这些文件的查找、装载和解释。

类库实际上是一组类文件。其中每个文件都有一个public类,以及任意数量的非public类。因此每个文件都有一个构件,如果希望这些构件(每个都有它们自己的独立的.java和.class文件)从属于同一个群组,就可以使用关键字packge

如果使用packge语句,它必须是文件中除注释以外的第一句代码。在文件的起始处写:

代码语言:javascript
复制
packge access;

就表示你在声明该编译单元是为access的类库的一部分。或者,你正在声明的编译单元中的public类名称是位于access名称下。任何想使用该编译单元的人必须指定全名或者与access结合使用关键字import(要注意的是,Java包的命名规则全部使用小写字母,包括中间的字也是如此)

代码语言:javascript
复制
// 在access.mypackage 定义类MyClass
package access.mypackage
public class MyClass{}

// 使用MyClass类
// 第一种方式:全名
public class QualifiedMyClass{
    public static void main(String[] args){
        access.mypackage.MyClass m = new access.mypackage.MyClass();
    }
}

// 第二种方式:import
import access.mypackage.*

public class QualifiedMyClass{
    public static void main(String[] args){
        MyClass m = new MyClass();
    }
}

package和import关键字允许你做的,是将单一的全局名字空间隔开,使得无论多少人使用Imternet以及Java开始编写类,都不会出现名称冲突问题

创建独一无二的包名

包可以由许多.class文件构成。怎样创建独一无二的名称以及怎样查找有可能隐藏于目录中某处的类。这是通过将.class文件所在的路径位置编码成package的名称来实现的。按照管理,package名称的第一部分是类的创建者的反顺序的Internet域名,第二部分是把package名称分解为你机器上的一个目录。所以当Java程序运行并且需要加载.class文件的时候,它就可以确定.class文件在目录上所处的位置

Java解释器的运行过程

首先,找出环境变量CLASSPATH,用作查找.class文件的根目录。从根目录开始,解释器获取包的名称并将每个句点替换成反斜杠,以从CLASSPATH根中产生一个路径名称(于是,package foo.bar.baz就变成foo\bar\baz或foo/bar/baz或其他,取决于操作系统)。解释器就在这些目录中查找与你想要创建的类名称相关的.class文件。

冲突

如果将两个含有相同名称的类库以 * 的形式同时导入?

代码语言:javascript
复制
import new.mindview.simple.*;
import java.util.*;

由于java.util.*也含有一个Vector类,这就存在潜在的冲突。如果现在要创建一个Vector类的化,就会产生冲突:

代码语言:javascript
复制
Vector v = new Vector(); 

这将产生一个问题,编译器并不清楚要用哪个Vector,此时编译器会要求你明确指明。

代码语言:javascript
复制
java.util.Vector v = new java.util.Vector(); 
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 包:库单元
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档