主页
  • 主页
  • 分类
  • 热文
  • 教程
  • 面试
  • 标签
Java

Java 基础

Java 主页
Java 概述
Java 历史
Java 功能
Java 与 C++
Java JVM(Java虚拟机)
Java JDK、JRE 和 JVM
Java Hello World 程序
Java 环境设置
Java 基本语法
Java 变量类型
Java 数据类型
Java 类型转换
Java Unicode 系统
Java 基本运算符
Java 注释
Java 用户输入
Java 日期和时间

Java 控制语句

Java 循环控制
Java 决策结构
Java if-else 语句
Java switch 语句
Java for 循环
Java for each 循环
Java while 循环
Java do...while 循环
Java break 语句
Java continue 语句

Java 面向对象编程

Java OOP概念
Java 类和对象
Java 类属性
Java 类方法
Java 方法
Java 变量作用域
Java 构造函数
Java 访问修饰符
Java 继承
Java 聚合
Java 多态
Java 覆盖
Java 方法重载
Java 动态绑定
Java 静态绑定
Java 实例初始化块
Java 抽象
Java 封装
Java 接口
Java 包
Java 内部类
Java 静态类
Java 匿名类
Java 单例类
Java 包装类
Java 枚举类
Java 枚举构造函数
Java 枚举字符串

Java 内置类

Java 数字
Java 布尔值
Java 字符
Java 数组
Java 数学类

Java 文件处理

Java 文件
Java 创建文件
Java 写入文件
Java 读取文件
Java 删除文件
Java 目录操作
Java I/O流

Java 错误和异常

Java 异常
Java Try Catch
Java try-with-resources
Java 多个 Catch
Java 嵌套 try
Java finally
Java 抛出异常
Java 异常传播
Java 内置异常
Java 自定义异常

Java 多线程

Java 多线程
Java 线程生命周期
Java 创建线程
Java 启动线程
Java 加入线程
Java 命名线程
Java 线程调度
Java 线程池
Java 主线程
Java 线程优先级
Java 守护线程
Java 线程组
Java JVM 关闭

Java 同步

Java 线程同步
Java 块同步
Java 静态同步
Java 线程间通信
Java 线程死锁
Java 中断线程
Java 线程控制
Java 可重入锁

Java 网络

Java 网络编程
Java 套接字编程
Java URL 处理
Java URL 类
Java URLConnection 类
Java HttpURLConnection 类
Java Socket 类
Java 泛型

Java 集合

Java 集合框架
Java 集合接口

Java 接口

Java 列表接口
Java 队列接口
Java 映射接口
Java SortedMap 接口
Java 集合(Set)接口
Java SortedSet 接口

Java 数据结构

Java 数据结构
Java 枚举接口

Java 集合算法

Java 迭代器
Java 比较器
Java Comparable 接口

Java 高级

Java 命令行参数
Java Lambda 表达式
Java 发送电子邮件
Java 小应用程序
Java Javadoc
Java 自动装箱和拆箱
Java mismatch() 方法
Java REPL
Java 多版本发布 JAR
Java 私有接口方法
Java 金刚石操作符
Java 多分辨率图像 API
Java 集合的工厂方法
Java 模块系统
Java Nashorn 引擎
Java Optional 类
Java 方法引用
Java 功能接口
Java 默认方法
Java Base64 工具类
Java Switch 表达式
Java Collectors.teeing() 方法
Java 基准测试
Java 文本块
Java 动态CDS
Java ZGC
Java NullPointerException
Java jpackage
Java 密封类
Java 记录
Java 隐藏类
Java instanceof
Java 紧凑数字格式化
Java 垃圾回收
Java JIT 编译器

Java 杂项

Java 递归
Java 正则表达式
Java 序列化
Java 字符串类
Java 进程 API
Java Stream API
Java @Deprecated 注释
Java CompletableFuture API
Java Streams
Java 日期时间 API

基础

Java 主页
Java 概述
Java 历史
Java 功能
Java 与 C++
Java JVM(Java虚拟机)
Java JDK、JRE 和 JVM
Java Hello World 程序
Java 环境设置
Java 基本语法
Java 变量类型
Java 数据类型
Java 类型转换
Java Unicode 系统
Java 基本运算符
Java 注释
Java 用户输入
Java 日期和时间

控制语句

Java 循环控制
Java 决策结构
Java if-else 语句
Java switch 语句
Java for 循环
Java for each 循环
Java while 循环
Java do...while 循环
Java break 语句
Java continue 语句

面向对象编程

Java OOP概念
Java 类和对象
Java 类属性
Java 类方法
Java 方法
Java 变量作用域
Java 构造函数
Java 访问修饰符
Java 继承
Java 聚合
Java 多态
Java 覆盖
Java 方法重载
Java 动态绑定
Java 静态绑定
Java 实例初始化块
Java 抽象
Java 封装
Java 接口
Java 包
Java 内部类
Java 静态类
Java 匿名类
Java 单例类
Java 包装类
Java 枚举类
Java 枚举构造函数
Java 枚举字符串

内置类

Java 数字
Java 布尔值
Java 字符
Java 数组
Java 数学类

文件处理

Java 文件
Java 创建文件
Java 写入文件
Java 读取文件
Java 删除文件
Java 目录操作
Java I/O流

错误和异常

Java 异常
Java Try Catch
Java try-with-resources
Java 多个 Catch
Java 嵌套 try
Java finally
Java 抛出异常
Java 异常传播
Java 内置异常
Java 自定义异常

多线程

Java 多线程
Java 线程生命周期
Java 创建线程
Java 启动线程
Java 加入线程
Java 命名线程
Java 线程调度
Java 线程池
Java 主线程
Java 线程优先级
Java 守护线程
Java 线程组
Java JVM 关闭

同步

Java 线程同步
Java 块同步
Java 静态同步
Java 线程间通信
Java 线程死锁
Java 中断线程
Java 线程控制
Java 可重入锁

网络

Java 网络编程
Java 套接字编程
Java URL 处理
Java URL 类
Java URLConnection 类
Java HttpURLConnection 类
Java Socket 类
Java 泛型

集合

Java 集合框架
Java 集合接口

接口

Java 列表接口
Java 队列接口
Java 映射接口
Java SortedMap 接口
Java 集合(Set)接口
Java SortedSet 接口

数据结构

Java 数据结构
Java 枚举接口

集合算法

Java 迭代器
Java 比较器
Java Comparable 接口

高级

Java 命令行参数
Java Lambda 表达式
Java 发送电子邮件
Java 小应用程序
Java Javadoc
Java 自动装箱和拆箱
Java mismatch() 方法
Java REPL
Java 多版本发布 JAR
Java 私有接口方法
Java 金刚石操作符
Java 多分辨率图像 API
Java 集合的工厂方法
Java 模块系统
Java Nashorn 引擎
Java Optional 类
Java 方法引用
Java 功能接口
Java 默认方法
Java Base64 工具类
Java Switch 表达式
Java Collectors.teeing() 方法
Java 基准测试
Java 文本块
Java 动态CDS
Java ZGC
Java NullPointerException
Java jpackage
Java 密封类
Java 记录
Java 隐藏类
Java instanceof
Java 紧凑数字格式化
Java 垃圾回收
Java JIT 编译器

杂项

Java 递归
Java 正则表达式
Java 序列化
Java 字符串类
Java 进程 API
Java Stream API
Java @Deprecated 注释
Java CompletableFuture API
Java Streams
Java 日期时间 API

Java 包


上一章 下一章

Java 包(Package)是用来防止命名冲突,控制访问权限,以及让类、接口、枚举和注解等类型的查找和使用更加方便。简单来说,Java 包可以定义为相关类型(类、接口、枚举和注解)的分组,提供访问保护和命名空间管理。

Java 包有两种类型:

  1. 内置 Java 包:这些是由 Java 平台提供的标准库,比如 java.lang,java.io 等。
  2. 用户定义的 Java 包:用户可以根据需要创建自己的包来组织相关的类或接口。

一些现有的 Java 包包括:

  • java.lang:捆绑了一些基础的类。
  • java.io:捆绑了输入输出功能的类。

用户定义的 Java 包

你可以定义自己的包来捆绑类或接口的集合。将相关的类分组在一起是一个好习惯,这样程序员可以很容易地确定这些类、接口、枚举和注解是相关的。

由于包创建了一个新的命名空间,所以不会与其他包中的名称发生冲突。使用包也更容易提供访问控制,并且也更容易找到相关的类。

创建 Java 包

创建包时,你需要选择一个包名,并在包含你想要包含在包中的类、接口、枚举和注解类型的每个源文件的顶部包含一个包声明。

包声明应该是源文件的第一行。每个源文件中只能有一个包声明,并且它适用于文件中的所有类型。

如果不使用包声明,则类、接口、枚举和注解类型将被放置在当前的默认包中。

编译带包声明的 Java 程序

要编译带有包声明的 Java 程序,你需要使用 -d 选项指定输出目录,如下面的命令所示:

javac -d Destination_folder file_name.java

然后会在指定的目的地创建一个与给定的包名同名的文件夹,并且编译后的类文件会被放置在这个文件夹中。

Java 包示例

下面是一个创建名为 animals 的包的示例。通常建议使用小写字母作为包名,以避免与类和接口的名字发生冲突。

创建包

/* 文件名 : Animal.java */
package animals;

interface Animal {
   public void eat();
   public void travel();
}

实现接口

现在,让我们在同一包 animals 中实现上面的接口:

package animals;
/* 文件名 : 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();
   }
} 

输出

编译并运行上述代码后,输出将是:

Mammal eats
Mammal travels

导入 Java 包

如果一个类想要使用同一包中的另一个类,那么不需要使用包名。同一包内的类可以直接相互引用,无需特殊的语法。

如果类不在同一个包内,那么可以使用完全限定名,或者使用 import 语句导入整个包或单个类。

示例

假设 Employee 类在 payroll 包内,Boss 类也需要引用 Employee 类,那么 Boss 类可以像下面这样做:

package payroll;
public class Boss {
   public void payEmployee(Employee e) {
      e.mailCheck();
   }
}

如果 Employee 类不在 payroll 包内,那么 Boss 类必须使用以下任一技术来引用不同包中的类:

  • 使用完全限定名,例如 payroll.Employee。
  • 使用 import 关键字和通配符 * 导入整个包,例如 import payroll.*。
  • 使用 import 关键字导入单个类,例如 import payroll.Employee。

示例

package payroll;

public class Employee {
   public void mailCheck() {
      System.out.println("Pay received.");
   }
}
package payroll;

import payroll.Employee;

public class Boss {
   public void payEmployee(Employee e) {
      e.mailCheck();
   }
   
   public static void main(String[] args) {
      Boss boss = new Boss();
      Employee e = new Employee();
      boss.payEmployee(e);
   }
}

输出

Pay received.

Java 包的目录结构

当一个类被放置在一个包中时,会产生两个主要的结果:

  1. 包的名字成为了类名的一部分,正如我们在前一节讨论的那样。
  2. 包的名字必须匹配存放相应字节码的目录结构。

这里有一种简单的文件管理方式:

  • 将类、接口、枚举或注解类型的源代码放在一个文本文件中,文件名是类型的简单名称,扩展名为 .java。

例如:

// 文件名 : Car.java
package vehicle;

public class Car {
   // 类的实现。
}

现在,将源文件放在一个反映该类所属包的名称的目录中:

...\vehicle\Car.java

此时,限定的类名和路径名如下:

  • 类名 → vehicle.Car
  • 路径名 → vehicle\Car.java (在 Windows 中)

一般来说,公司会使用其反向的互联网域名作为其包名。

示例

假设一家公司的互联网域名为 apple.com,那么它的所有包名都会以 com.apple 开头。包名的每一部分都对应一个子目录。

例如,如果该公司有一个名为 com.apple.computers 的包,该包包含一个 Dell.java 源文件,那么它将被包含在一系列子目录中:

...\com\apple\computers\Dell.java

在编译时,编译器为每个在其中定义的类、接口和枚举创建不同的输出文件。输出文件的基础名是类型的名称,扩展名是 .class。

例如:

// 文件名 : Dell.java
package com.apple.computers;

public class Dell {
}

class Ups {
}

现在,使用 -d 选项编译这个文件:

$ javac -d . Dell.java

文件将会被编译为:

.\com\apple\computers\Dell.class
.\com\apple\computers\Ups.class

你可以像下面这样导入 com.apple.computers 中定义的所有类或接口:

import com.apple.computers.*;

与 .java 源文件类似,编译后的 .class 文件也应该位于反映包名的一系列目录中。但是,.class 文件的路径并不一定要与 .java 源文件的路径相同。你可以分别安排你的源文件和类文件目录,如下:

<path-one>\sources\com\apple\computers\Dell.java
<path-two>\classes\com\apple\computers\Dell.class

通过这样做,可以允许其他程序员访问类目录而不泄露你的源代码。你也需要以这种方式管理源文件和类文件,以便编译器和 Java 虚拟机(JVM)能够找到程序使用的所有类型。

类目录的完整路径 <path-two>\classes 称为类路径,并通过系统变量 CLASSPATH 设置。编译器和 JVM 通过将包名添加到类路径来构建到 .class 文件的路径。

假设 <path-two>\classes 是类路径,包名是 com.apple.computers,那么编译器和 JVM 将在 <path-two>\classes\com\apple\computers 中查找 .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:\users\jack\java\classes
  • 在 Unix 中:% CLASSPATH = /home/jack/java/classes; export CLASSPATH
上一章 下一章
阅读号二维码

关注阅读号

联系二维码

联系我们

© 2024 Yoagoa. All rights reserved.

粤ICP备18007391号

站点地图