疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

Java教程Java包/package


 

 
在Java中使用包,以防止命名冲突,控制访问,使搜索/定位和类,接口,枚举和注解的使用更容易,等等。
 
一个包可以被定义为相关类型(类,接口,枚举和注解)提供访问保护和命名空间管理的分组。
 
一些在Java中现有的包是:
 
java.lang – 捆绑的基础类
 
java.io – 用于输入,输出功能的类捆绑在这个包
 
程序员可以定义自己的包捆绑组的类/接口等,这是一个很好的做法来实现相关的类,使程序员可以很容易地确定的类,接口,枚举,注释都是相关的。
 
由于包创建一个新的命名空间不会有与其他包名称的任何名称冲突。使用包,它更容易提供访问控制,它也更容易找到相关的类。
 
创建一个包:
 
创建一个包的时候,应该选择的包的名称,并把包语句具有该名称在每个源文件的顶部,包含要在包中包括的类,接口,枚举和注解类型。
 
package语句必须是源文件中的第一行。只能有各一个源文件中package语句,并且它适用于所有类型的文件中。
 
如果不使用package语句则类,接口,枚举和注释类型将被放入一个未命名的包。
 
例子:
 
让我们看看它创建了一个名为 animals 包的示例。它是用小写名称,以避免与类,接口名称的任何冲突常见的做法。
 
把一个接口放在包animals:
 
/* File name : Animal.java */
package animals;
 
interface Animal {
   public void eat();
   public void travel();
}
现在,把一个实现在同一个 animals 包中: 
 
package animals;
 
/* File name : MammalInt.java */
public class MammalInt implements Animal{
 
   public void eat(){
      System.out.println("Mammal eats");
   }
 
   public void travel(){
      System.out.println("Mammal travels");
   } 
 
   public int noOfLegs(){
      return 0;
   }
 
   public static void main(String args[]){
      MammalInt m = new MammalInt();
      m.eat();
      m.travel();
   }
现在,编译这两个文件,并把它们放到一个子目录叫做 animals 并尝试运行如下: 
$ mkdir animals
$ cp Animal.class  MammalInt.class animals
$ java animals/MammalInt
Mammal eats
Mammal travels
import 关键字:
 
如果一个类希望使用另一个类在同一包中,包的名称并不需要被使用。在同一个包中的类发现对方没有任何特殊的语法。
 
例子:
 
在这里,一个叫Boss类添加到已包含Employee的payroll 包。然后,Boss可以参考Employee类,而不使用前缀工资,主要表现如以下Boss类。
 
package payroll;
 
public class Boss
{
   public void payEmployee(Employee e)
   {
      e.mailCheck();
   }
}
如果Boss类不在payroll 包会发生什么?Boss类必须然后使用下列方法之一来引用类在不同的包。
 
可以使用类的完全限定名。例如:
 
payroll.Employee
包可以使用import关键字和通配符(*)导入。例如:
 
import payroll.*;
类本身可以使用import关键字导入。例如:
 
import payroll.Employee;
注:一个类文件可以包含任意数量的导入语句。 package语句之后,并在类声明之前的import语句必须出现。
 
软件包的目录结构:
 
当一个类被放置在一个包中发生两个主要结果:
 
包的名称将成为类的名称的一部分,正如我们在上一节刚刚讨论。
 
包的名称必须与相应的字节码所在的目录结构相匹配。
 
下面是简单的管理中的Java文件的方式:
 
把源代码的类,接口,枚举或注释类型在一个文本文件,其名称的类型,其扩展名是 .java。例如:
 
// File Name :  Car.java
 
package vehicle;
 
public class Car {
   // Class implementation.   
}
现在,把源文件中的目录,其名称反映了类所属的包的名称:
 
....vehicleCar.java
现在,合格的类名和路径名会是如下:
 
类名称 -> vehicle.Car
 
路径名称 -> vehicleCar.java (in windows)
 
一般情况下,一家公司使用其反向的Internet域名,其包名。例:某公司的Internet域名是apple.com,那么它的所有包名就开始就可以为 com.apple。包名称的每个组件对应一个子目录。
 
例如:公司有包含一个Dell.java源文件com.apple.computers包,将它包含在一系列这样的子目录:
 
....comapplecomputersDell.java
在编译时,编译器会为它定义的每个类,接口和枚举不同的输出文件。输出文件的基本名称是类型的名称,及其扩展名是 .class
 
例如:
 
// File Name: Dell.java
 
package com.apple.computers;
public class Dell{
      
}
class Ups{
      
}
现在,编译该文件使用-d选项,如下所示:
 
$javac -d . Dell.java
这将使编译后的文件如下所示:
 
.comapplecomputersDell.class
.comapplecomputersUps.class
可以导入所有已定义的类或接口  comapplecomputers  如下:
 
import com.apple.computers.*;
像 .java源文件,编译后的 .class文件应该是在一个系列,反映包名的目录。然而,类文件并不一定是相同的 .java源文件路径。可以单独安排源文件和类目录,如:
 
<path-one>sourcescomapplecomputersDell.java
 
<path-two>classescomapplecomputersDell.class
通过这样做,可以给classes目录到其他程序员不透露源代码。还需要管理这种方式的源文件和类文件,使编译器和Java虚拟机(JVM)可以找到所有程序使用的类型。
 
完整路径的classes目录,<path-two>类,被称为类路径,并设置与CLASSPATH系统变量。无论是编译器和JVM通过将包名到类路径构建的路径 .class 文件。
 
<path-two>classes是类路径和包名是com.apple.computers,那么编译器和JVM将寻找在<path-two>classescomapplecompters 文件中的 .class文件。 
 
类路径可能包括几个路径。多条路径应该用分号(Windows)或冒号(UNIX)分隔。默认情况下,编译器和JVM搜索当前目录,并包含了Java平台的类,使这些目录会自动在类路径的JAR文件。
 
设置CLASSPATH系统变量:
 
要显示当前的CLASSPATH变量,使用Windows和UNIX(Bourne shell的)下面的命令:
 
在Windows -> C:> set CLASSPATH
 
在UNIX -> % echo $CLASSPATH
 
要删除CLASSPATH变量的当前内容,使用:
 
在 Windows -> C:> set CLASSPATH=
 
在 UNIX -> % unset CLASSPATH; export CLASSPATH
 
要设置CLASSPATH变量:
 
在 Windows -> set CLASSPATH=C:usersjackjavaclasses
 
在 UNIX -> % CLASSPATH=/home/jack/java/classes; export CLASSPATH