01、包、import

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 用于导入 其它包中的类。

  • 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.*;
// import static java.lang.Math.sqrt;
// import static java.lang.Math.PI;

public class Main {
    public static void main(String[] args) {
        double result = sqrt(25);    // 直接调用 sqrt()
        double circleArea = PI * 5 * 5; // 直接访问 PI
    }
}

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 来做防护。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值