专栏首页学习笔记持续记录中...Java基础:六、包 (1)

Java基础:六、包 (1)

包:库单元

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

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

// 一种方式:用其全名java.util.ArrayList来指定
public class FullQualification{
    public static void main(String[] args){
        java.util.ArrayList list = new java.util.ArrayList();
    }
}
// 另一种方式:使用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语句,它必须是文件中除注释以外的第一句代码。在文件的起始处写:

packge access;

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

// 在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文件。

冲突

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

import new.mindview.simple.*;
import java.util.*;

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

Vector v = new Vector(); 

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

java.util.Vector v = new java.util.Vector(); 

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • TestNG 异常测试

    在开始前先大概了解下 Java 中异常的分类有两种异常:Error 和 Exception

    桑鱼
  • Java-内部类

    如果想从外部类的非静态方法之外的任意位置创建某个内部类的对象(在静态方法内部创建某个内部类的对象),那么必须像在main()方法中那样,具体地指明这个对象的类型...

    桑鱼
  • YAML

    SpringBoot支持使用一个全局的配置配置文件,目录在src/main/resources或者类路径/config,全局配置文件可以对一些默认配置值进行修改...

    桑鱼
  • java BeanUtils 使用示例

    在做项目中,经常会用到将带有数据库表格式的XML数据,放入对应的实体中,再保存进数据库。现在的程序都是从老人手里接下来的,代码也是最笨的set属性,每次增加一...

    甲蛙全栈
  • 第80节:Java中的MVC设计模式

    事务,设置自动连接提交关闭. setAutoCommit(false); conn.commit(); conn.rollBack

    达达前端
  • 24.C++- 抽象类(存虚函数)、接口、多重继承

    抽象类和接口 什么是抽象类 用来表示现实世界中的抽象概念 是一种只能定义类型,而不能产生对象的类 只能被子类继承,且抽象类的相关成员函数没有完整的体现,用来被子...

    张诺谦
  • 一个插排引发的设计思想 (二) 抽象类与接口

    FlyLolo
  • 《挑战30天C++入门极限》C++类的继承与多重继承的访问控制

    landv
  • 《Spring实战》摘录 - 13

    问题: #7.2.1-4 | 与StandardServletMultipartResolver有所不同,CommonsMultipart-Resolver会不...

    用户1335799
  • 万能的Hello World

    4 重点 @RestController 声明一个rest服务 @SpringBootApplication 表明为springboot的开始

    大话swift

扫码关注云+社区

领取腾讯云代金券