1、package 的作用
- 1、提供多层命名空间,解决命名冲突。
- 2、包提供了更容易的的访问控制。
- 3、对类按功能进行分类,使项目的组织更加清晰。
2、增加 package 以后,在 DOS 下怎么编译?
- 示例:
- 在 ~/IdeaProjects/rain-lotus/materials-javabase/src/main/java/org/rainlotus/materials/javabase 目录下执行的命令。
- 编译:javac -d a03_datatype a03_datatype/JavaDataType.java
- 生成的 class 在 a03_datatype 的 org/rainlotus/materials/javabase/a03_datatype 目录下。
- 执行:java -cp a03_datatype **org.rainlotus.materials.javabase.a03_datatype.**JavaDataType

3、import 是用于导入包还是导入类?
- import的作用:只是告诉编译器:
- “在代码中遇到未明确包名的类时,去这些包中查找”,相当于一种编译时的快捷方式。
- 在包中定位类是编译器( compiler)的工作。
- 类文件中的字节码总是使用完整的包名来引用其他类(类的全限定名)。
- 编译后:
- import 信息不会保留在 .class 文件中,对运行时无任何影响。
- 编译后的代码:
- 无论是否用 import java.util.* ,生成的 .class 文件中类的全限定名都会被明确写出
package org.rainlotus.materials.javabase.a04_oop.aboutpackage;
import java.util.Date;
public class PackageTest {
public static void main(String[] args) {
System.out.println(new Date());
}
}
- 上下两段代码等价:
- 因为,import 只是简化 代码编写,不会影响最终编译结果。
package org.rainlotus.materials.javabase.a04_oop.aboutpackage;
public class PackageTest {
public static void main(String[] args) {
System.out.println(new java.util.Date());
}
}
- 类比:类似于书本的“目录”,帮助读者快速定位内容,但目录本身不影响书籍内容的执行速度。
4、import java.util.*; 会不会降低程序运行速度?为什么?
- 在 Java 中,import java.util.*; 不会降低 程序运行速度。
- 因为 import 语句的作用仅限于编译阶段,与运行时性能无关。
- *import 会 轻微增加编译时间
- 编译器在解析 import * 时需扫描整个包的类列表。
- 可能略微增加编译时间,但影响可以忽略不计(现代 IDE 和编译器已优化此过程)。
5、import static (静态导入)的作用是导入类还是导入类的静态属性和静态方法?
- 在 Java 中,import static 的作用是直接导入类的静态属性和 静态方法,而不只是 类。
- 通过静态导入,可以直接在代码中使用这些静态成员,而无需通过类名限定。
import static 包名.类名.静态成员名;
import static 包名.类名.*;
- import static java.lang.Math.*; // 导入 Math 类下所有的静态成员。从而允许 省略 类名
import static java.lang.Math.*;
public class Main {
public static void main(String[] args) {
double result = sqrt(25);
double circleArea = PI * 5 * 5;
}
}
6、如果同时导入:java.util.Date; java.sql.Date; 在程序中怎么区分它们?
- 只能用包名 + 类名来 显式调用 相关类
- java.util.Date date = new java.util.Date();
7、Java 中的 import VS C++ 中的 #include
- Java 的 import
- 编译时符号解析:
- import 语句告诉编译器在编译时如何查找类或静态成员的完全限定名。
- 可选性:
- import 仅是为了简化代码书写。
- 可以直接用全限定名代替(如:java.util.ArrayList list = …)。
- 类加载机制:实际代码由类加载器在运行时动态加载,确保类唯一性。
- C++ 的 #include
- 预处理文本替换:
- #include 是预处理指令,在编译前将头文件内容直接复制粘贴到当前文件中。
- 必要性:
- 必须通过 #include 引入声明(如:函数、类定义),否则编译器 无法识别符号。
- 物理代码合并:
- 多次引入同一头文件可能导致重复定义错误。
- 需用 #pragma once 或 #ifndef 来做防护。