HelloWorld.java。它是 Java 源代码(.java文件)经过编译后生成的二进制文件,里面存储的是 Java 虚拟机(JVM)能识别的指令。
.java文件中的每个类(包括public类和非public类),编译后都会单独生成一个.class文件,文件名和类名一致。.jar),类似 “文件夹压缩包”。总结:.java是程序员写的 “源代码”,编译成.class字节码,多个.class打包成JAR方便管理,而JVM是运行.class字节码的 “虚拟机”,让 Java 程序不依赖操作系统即可运行。
假设你和朋友各自写了一个名为User的类:
User用于管理用户信息,朋友写的User用于游戏角色。User,这就是 “命名冲突”。Java 之父设计 package 和 import 的核心目的: 像 “文件夹” 一样给类分类,避免命名冲突,让代码更有序。
可以理解成图书馆的书在不同的分区,比如《战争与和平》这本书就有 列夫・托尔斯泰(文学)和卡尔・冯・克劳塞维茨(军事学)两种,虽然名字相同但是内容不同,应该也在不同的分区。
package com.example.user;,相当于把这个类放在com/example/user这个 “虚拟文件夹” 里。其他类要找到它,必须知道这个完整地址。 package 的作用:
com.example.user.User类:com.example.user.User user = new com.example.user.User();import com.example.user.User;,就可以直接写User user = new User();注意点:
import com.example.user.*;表示导入这个包下的所有类,但不会导入子包(比如com.example.user.admin)。package com.mindviewinc.simple;),其编译后的.class文件需要存放在与包名对应的目录下。.class文件。.class文件。当使用import导入多个类库,且这些类库中包含同名的类时,就可能引发冲突。例如:
import com.mindviewinc.simple.*; // 导入包中的所有类
import java.util.*; // 导入Java自带的工具类库这里com.mindviewinc.simple和java.util两个包中都有Vector类,若直接创建Vector对象:
Vector v = new Vector(); // 编译器会报错,因为不知道该用哪个包的Vector直接写出类的完整包路径,绕过import的模糊引用:
java.util.Vector v = new java.util.Vector(); // 明确使用java.util包的Vector这样即使导入了多个同名类,也能通过完整路径告诉编译器具体使用哪个类。
不使用import package.*;批量导入,而是只导入需要的类:
import com.mindviewinc.simple.Vector; // 只导入simple包的Vector
// 不导入java.util.*,若需使用java.util的其他类,单独导入或用完整路径import package.*;批量导入,尽量单个类导入以减少冲突风险。通过封装常用功能到工具库中,避免重复编写代码,提高开发效率。例如将频繁使用的数组生成方法封装成工具类,供不同项目复用。
com.mindviewinc.util),利用域名唯一性避免冲突。Range的实现与功能以Range类为例,展示如何编写工具库中的实用方法:
package onjava; // 声明包名为onjava
public class Range {
// 1. 生成[0, n)的整数数组(如range(5) → [0,1,2,3,4])
public static int[] range(int n) {
int[] result = new int[n];
for (int i = 0; i < n; i++) result[i] = i;
return result;
}
// 2. 生成[start, end)的整数数组(如range(2, 7) → [2,3,4,5,6])
public static int[] range(int start, int end) {
int sz = end - start;
int[] result = new int[sz];
for (int i = 0; i < sz; i++) result[i] = start + i;
return result;
}
// 3. 按步长生成数组(如range(1, 10, 2) → [1,3,5,7,9])
public static int[] range(int start, int end, int step) {
int sz = (end - start) / step;
int[] result = new int[sz];
for (int i = 0; i < sz; i++) result[i] = start + i * step;
return result;
}
}编译完之后,就可以在系统的任何地方使用import onjava语句来使用这些方法了。之后无论何时你创建了有用的新工具,都可以把它加入到自己的类库中。
import是引入了类的映射路径,告诉JVM在哪里可以找到类。但是这是一个上层的理解。相似的也有:
import onjava.*语句的作用是导入onjava包下的所有public 类(包括它们的.class文件)
但是在底层:import 语句的核心作用发生在 Java 源文件(.java)的编译阶段,其本质是:
import java.util.List; // 声明 import
List<String> list; // 编译后变为 java.util.List<String> list;JVM根据.class文件来创建Class对象,一个.class文件一般会有很多类,那每个类都会创建一个唯一的Clss对象。但是,并不是一开始的时候所有Class类都创建好了,它是按需创建的。
扩展:我们知道Clss对象在堆内存,而其运行时常量池,字段表,方法表,继承关系等都在元空间(方法区),同时这些东西又叫类结构。

组件 | 职责范围 | 关键作用点 | 协作关系 |
|---|---|---|---|
编译器 | 编译期(处理.java 文件) | 将 Java 源码编译为.class 字节码 | 为类加载器提供输入 |
类加载器 | 运行期(JVM 启动后) | 加载.class 文件到内存生成 Class 对象 | 作为 JVM 的子系统 |
JVM | 运行期(管理整个执行环境) | 执行字节码、内存管理、垃圾回收等 | 调用类加载器加载类 |
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。