Java知识点——包

Java 允许使用包( package )将类组织起来。借助于包可以方便地组织自己的代码,并将自己的代码与别人提供的代码库分开管理。使用包的主要原因是确保类名的唯一性。假如两个程序员不约而同地建立了 Employee类。只要将这些类放置在不同的包中, 就不会产生冲突。从编译器的角度来看, 嵌套的包之间没有任何关系。例如,java.util 包与java.util.jar 包毫无关系。每一个都拥有独立的类集合。

类的导入

一个类可以使用所属包中的所有类, 以及其他包中的公有类( public class)。我们可以采用两种方式访问另一个包中的公有类。第一种方式是在每个类名之前添加完整的包名。例如:

java.time.LocalDate today = java.time.LocalDate.now();

这显然很繁琐。更简单且更常用的方式是使用 import 语句导入一个特定的类或者整个包。import 语句应该位于源文件的顶部(但位于 package 语句的后面)。例如, 可以使用下面这条语句导入 java.util 包中所有的类。

import java.util .*;

然后, 就可以使用

LocalDate today = LocalDate.now();

而无须在前面加上包前缀。还可以导入一个包中的特定类

import java.time.LocalDate;

java.time.* 的语法比较简单,对代码的大小也没有任何负面影响。当然, 如果能够明确地指出所导入的类, 将会使代码的读者更加准确地知道加载了哪些类。
但是, 需要注意的是, 只能使用星号(*) 导入一个包, 而不能使用 import java.*
import java.*.* 导入以 java 为前缀的所有包。在大多数情况下, 只导入所需的包, 并不必过多地理睬它们。但在发生命名冲突的时候,就不能不注意包的名字了。例如,java.util 和 java.sql 包都有日期( Date) 类。如果在程序中导入了这两个包:

import java.util .*;
import java.sql .*;

在程序使用 Date 类的时候, 就会出现一个编译错误:

	Date today; // Error java.util .Date or java.sql .Date?

此时编译器无法确定程序使用的是哪一个 Date 类。可以采用增加一个特定的 import 语句来解决这个问题

import java.util .*;
import java.sql .*;
import java.util .Date;

如果需要使用这两个 Date 类则在每个类名的前面加上完整的包名。

	java.util .Date deadline = new java.util .Date();
	java.sql .Date today = new java.sql .Date(...);

包中定位类是编译器 ( compiler) 的工作。类文件中的字节码肯定使用完整的包名来引用其他类。

静态导入

import 语句不仅可以导入类,还增加了导入静态方法和静态域的功能。例如,如果在源文件的顶部, 添加一条指令:

import static java.lang.System.*;

就可以使用 System 类的静态方法和静态域,而不必加类名前缀:

	out.println("Goodbye, World!"); // i.e., System.out
	exit(0); //i.e., System.exit

另外,还可以导入特定的方法或域:

import static java.lang.System.out;

将类放入包中

要想将一个类放入包中, 就必须将包的名字放在源文件的开头,包中定义类的代码之前。例如:

package com.horstiann.corejava;
public class Employee
{

}

如果没有在源文件中放置 package 语句, 这个源文件中的类就被放置在一个默认包( defaulf package ) 中。默认包是一个没有名字的包。在此之前,我们定义的所有类都在默认包中。将包中的文件放到与完整的包名匹配的子目录中。例如,com.horstmann.corejava 包中的所有源文件应该被放置在 Windows 中 com\horstmann\corejava中。编译器将类文件也放在相同的目录结构中。
假设编写的 PackageTest 类放置在默认包中;Employee 类放置在 com.horstmann.corejava 包中。因此, Employee.java 文件必须包含在子目录com\horstmann\corejava中。要想编译这个程序, 只需改变基目录,并运行命令

javac PackageTest.java

编译器就会自动地查找文件 com/horstmann/corejava/Employee.java 并进行编译。下面看一个更加实际的例子。在这里不使用默认包, 而是将类分别放在 com. horstmann.corejava 和 com.mycompany中,
在这种情况下,仍然要从基目录编译和运行类,即包含 com 目录:

javac com/myconipany/PayrollApp.java
java com.mycompany.PayrollApp

需要注意,编译器对文件 (带有文件分隔符和扩展名 .java 的文件)进行操作。而 Java 解释器加载类(带有 . 分隔符 )。

包作用域

标记为 public 的部分可以被任意的类使用;标记为 private 的部分只能被定义它们的类使用。如果没有指定 public 或 private , 这个部分(类、方法或变量)可以被同一个包中的所有方法访问。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值