为了更好地组织类,Java 提供了包机制,用于区别类名的命名空间。
包的作用
- 把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用。
- 如同文件夹一样,包也采用了树形目录的存储方式。同一个包中的类名字是不同的,不同的包中的类的名字是可以相同的。当同时调用两个不同包中相同类名的类时,应该加上包名加以区别,防止命名冲突。
- 包限定了访问权限,拥有包访问权限的类才能访问某个包中的类。
创建包
- 一个包可以定义为一组相互联系的类型(类、接口、枚举和注释),为这些类型提供访问保护和命名空间管理的功能。由于包创建了新的命名空间,所以不会跟其他包中的任何名字产生命名冲突。
- 创建包的时候,为这个包取名,使用小写的字母来命名避免与类、接口名字的冲突。如果之后其他源文件包含了这个包提供的类、接口、枚举或者注释类型的时候,都必须将这个包的声明放在这个源文件的开头。
- 包声明应该在源文件的第一行,每个源文件只能有一个包声明,这个文件中的每个类型都应用于它。
- 如果源文件中没有使用包声明,那么其中的类,函数,枚举,注释等将被放在一个无名的包中。
使用包语句
语法格式
package pkg1[.pkg2[.pkg3…]];
一个Something.java 文件内容:它的保存路径应该是 net/java/util/Something.java 。
package net.java.util;
public class Something{ ... }
在 animals 包中加入一个接口(interface):
* 文件名: Animal.java */
package animals;
interface Animal {
public void eat();
public void travel();
}
接下来,在同一个包中加入该接口的实现:
/* 文件名 : MammalInt.java */
package animals;
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 travel
import 关键字
- 使用某一个包的成员时,需要在程序中用 import 关键字用于导入其他类或包中定义的类型。
- 在导入类或包时,需要提供类或包的完全限定名。完全限定名包括包名和类名的组合。
- import 关键字用于引入其他包中的类、接口或静态成员,它允许你在代码中直接使用其他包中的类,而不需要完整地指定类的包名。在同一个包中,一个类想要使用本包中的另一个类,那么该包名可以省略。
在类文件中可以包含任意数量的 import 声明。import 声明必须在包声明之后,类声明之前。
语法格式
import package1[.package2…].(classname|*);
// 第一行非注释行是 package 语句
package com.example;
// import 语句引入其他包中的类
import java.util.ArrayList;
import java.util.List;
// 类的定义
public class MyClass {
// 类的成员和方法
}
可以使用 import语句来引入一个特定的类:
import com.example.MyClass;
也可以使用通配符 * 来引入整个包或包的子包:
import com.example.mypackage.*;
下面的 payroll 包已经包含了 Employee 类,接下来向 payroll 包中添加一个 Boss 类。Boss 类引用 Employee 类的时候可以不用使用 payroll 前缀。
package payroll;
public class Boss {
public void payEmployee(Employee e) {
e.mailCheck();
}
}
如果 Boss 类不在 payroll 包中,Boss 类必须使用下面几种方法之一来引用其他包中的类:
// 使用类全名描述:
payroll.Employee
// 用 import 关键字引入,使用通配符 *:
import payroll.*;
// 使用 import 关键字引入 Employee 类:
import payroll.Employee;
package 的目录结构
类放在包中:
- 包名成为类名的一部分。
- 包名必须与相应的字节码所在的目录结构相吻合。
将类、接口等类型的源码放在一个文本中,文件的名字就是这个类型的名字,并以.java作为扩展名。
// 文件名:Car.java
package vehicle;
public class Car {
// 类实现
}
接下来,把源文件放在一个目录中,这个目录要对应类所在包的名字。
....\vehicle\Car.java
现在,正确的类名和路径是:
-
类名 -> vehicle.Car
-
路径名 -> vehicle\Car.java (windows)
编译时,编译器为包中定义的每个类、接口等类型各创建一个不同的输出文件,输出文件的名字就是这个类型的名字,并加上 .class 作为扩展后缀。
// 文件名: Car.java
package com.car.test;
public class BYD { }
class NIO { }
用 -d 选项来编译这个文件:
$javac -d . Car.java
这样会像下面这样放置编译了的文件:
.\com\car\test\BYD.class
.\com\car\test\NIO.class
编译之后的 .class 文件应该和 .java 源文件一样,它们放置的目录应该跟包的名字对应起来。但是,并不要求 .class 文件的路径跟相应的 .java 的路径一样;可以分开来安排源码和类的目录。
<path-one>\sources\com\car\test\BYD.java
<path-two>\classes\com\car\test\NIO.class
类目录的绝对路径叫做 class path,设置在系统变量 CLASSPATH 中。编译器和 java 虚拟机通过将 package 名字加到 class path 后来构造 .class 文件的路径。
一个 class path 可能会包含好几个路径,多路径应该用分隔符分开。默认情况下,编译器和 JVM 查找当前目录。JAR 文件按包含 Java 平台相关的类,所以目录默认放在了 class path 中。
标签:包中,java,package,class,import,Java,public From: https://blog.csdn.net/weixin_74417251/article/details/143090330