Java基础教程之包(package)

作者:junjie 时间:2021-11-01 01:53:19 

我们已经写了一些Java程序。之前的每个Java程序都被保存为一个文件,比如Test.java。随后,该程序被编译为Test.class。我们最终使用$java Test来运行程序。

然而,在一个正常的Java项目中,我们往往需要编写不止一个.java程序,最终的Java产品包括了所有的Java程序。因此,Java需要解决组织Java程序的问题。包(package)的目的就是为了更好的组织Java程序。

Java基础教程之包(package)

包的建立

包的建立非常简单。我们只用在Java程序的开始加入package就可以了。我们以Human类为例,将它放入包中:


package com.vamei.society;

public class Human
{
    /**
     * constructor
     */
    public Human(int h)
    {
        this.height = h;
        System.out.println("I'm born");
    }

    /**
     * accessor
     */
    public int getHeight()
    {
        return this.height;
    }

    /**
     * mutator
     */
    public void growHeight(int h)
    {
        this.height = this.height + h;
    }

    private int height;
}

上面的第一行语句


package com.vamei.society;


表示该程序在com.vamei.society包中。com.vamei(vamei.com的反写)表示包作者的域名 (很可惜,这个域名已经被别人注册了,所以只起演示作用)。Java要求包要有域名前缀,以便区分不同作者。society为进一步的本地路径名。com.vamei.society共同构成了包的名字。

包为Java程序提供了一个命名空间(name space)。一个Java类的完整路径由它的包和类名共同构成,比如com.vamei.society.Human。相应的Human.java程序要放在com/vamei/society/下。类是由完整的路径识别的,所以不同的包中可以有同名的类,Java不会混淆。比如com.vamei.society.Human和com.vamei.creature.Human是两个不同的类。

再看一个细节。Human类是public的,其构造方法也是public的,所以任意其他对象都可以调用该类。我们之前说过,一个Java文件中只能有一个public的类,该类要去.java文件同名。一个类可以没有public关键字,它实际上也表示一种权限: 该类在它所在的包中可见。也就是说,包中的其他Java程序可以访问该类。这是Java中的默认访问权限。

同样,对象的成员也可以是默认权限(包中可见)。比如我们去掉getHeight()方法前面的public关键字。

包的调用

我们只需要将Human.java编译的Human.class放入相应的文件夹就可以了。比如,我将Human.class放入com/vamei/society/中。实际上,你也可以把.java文件放入相应路径,Java会在使用时自动编译。

如果整个包(也就是com文件夹)位于当前的工作路径中,那么不需要特别的设置,就可以使用包了,比如下面的TestAgain.java:


import com.vamei.society.*;

public class TestAgain
{
    public static void main(String[] args)
    {
        Human aPerson = new Human(180);
        System.out.println(aPerson.getHeight());
    }

}

import用于识别路径。利用import语句,我们可以引入相应路径下的类。*表示引入society文件夹下的所有类。在TestAgain中,我们直接使用了Human类。

我们也可以提供类的完整的路径。这可以区分同名但不同路径的类,比如:


public class TestAgain
{
    public static void main(String[] args)
    {
        com.vamei.society.Human aPerson =
                  new com.vamei.society.Human(180);
        System.out.println(aPerson.getHeight());
    }

}

由于我们提供了完整的类路径,所以不需要使用import语句。

如果包没有放在当前工作路径下,我们在使用包时,需要通知Java。比如,我们将包放在/home/vamei/javapackage中,这样Human.class位于/home/vamei/javapackage/com/vamei/society/Human.class,而我们的工作路径为/home/vamei。这样,包就无法被找到。一个方法是在使用javac和java时,用-classpath说明包所在的文件夹路径,比如:


$javac -classpath /home/vamei/javapackage:. TestAgain.java

$java -classpath /home/vamei/javapackage:. TestAgain

就是从/home/vamei/javapackage和工作路径(.)中寻找包。Java可以从/home/vamei/javapackage中可以找到Human类,从.中可以找到TestAgain类。

另外也可以设置系统的CLASSPATH环境变量,将上述路径加入到该变量中,而不用每次都键入-classpath选项。

类似于包的机制在其他语言中也很常见,比如Python中的import机制。它们都是为了更好的组织和使用已有的程序。利用包,我们可以比较容易的拓展Java程序,使用已有的Java程序库。注意到,包管理的是.class文件。Java号称"一次编译,处处运行" (Compile Once, run anywhere)。.class文件可以在任意装有Java虚拟机(JVM, Java Virtual Machine)的平台上运行,这帮助我们克服了系统差异造成的程序移植困难。

系统之间的差异可以非常大。如果我们用C语言编写程序,需要将源程序在各个平台上重新编译,以适应不同的硬件条件。 Java虚拟机衔接了平台和Java宇宙,它构成了硬件和编程逻辑的中间层。JVM隐藏了硬件差异,提供给程序员一个“标准”的Java宇宙。而.class文件可以看做这个 Java宇宙中流通的通货。在JVM的基础设施下,加上包的管理辅助,Java程序实现了良好的可移植性 (portability)。

总结

package, import

默认权限: 包中可见

-classpath, CLASSPATH

标签:Java,基础教程,包,package
0
投稿

猜你喜欢

  • Java编程用栈来求解汉诺塔问题的代码实例(非递归)

    2023-01-13 21:41:25
  • Android项目开发之UI设计器

    2022-03-26 14:28:32
  • 基于C#实现简单的随机抽奖小程序

    2023-07-14 10:15:50
  • Android编程实现ListView滚动提示等待框功能示例

    2022-11-15 13:50:15
  • Java servlet、filter、listener、interceptor之间的区别和联系

    2023-11-02 15:32:17
  • Android用tabhost实现 界面切换,每个界面为一个独立的activity操作

    2021-11-09 11:22:26
  • 举例讲解C#编程中对设计模式中的单例模式的运用

    2023-04-28 19:34:10
  • Java Bean与xml互相转换的方法分析

    2021-08-12 13:34:00
  • 深入理解C#中的枚举

    2022-06-03 02:58:34
  • 谈谈Java类型中ParameterizedType,GenericArrayType,TypeVariabl,WildcardType

    2022-10-18 17:43:07
  • 利用java开发简易版扫雷游戏

    2023-11-07 14:35:15
  • 使用Springboot搭建OAuth2.0 Server的方法示例

    2023-01-28 07:19:16
  • springboot整合mybatisplus的方法详解

    2023-05-20 18:35:05
  • 基于C#方法重载的总结详解

    2022-07-29 13:19:46
  • 关于C#结构体 你需要知道的

    2022-01-04 13:11:49
  • Android编程之selector下设置背景属性值的方法

    2023-08-23 08:07:49
  • RabbitMQ延迟队列及消息延迟推送实现详解

    2023-11-15 15:31:31
  • Java 二分法检索算法代码实现详解

    2022-01-05 19:13:24
  • Jackson 反序列化时实现大小写不敏感设置

    2021-11-18 06:17:18
  • Spring Security保护用户密码常用方法详解

    2023-01-24 17:06:18
  • asp之家 软件编程 m.aspxhome.com