对于初学者 java执行工具、javac编译工具;sourcepath、classpath环境变量 ;import关键字 、package关键字 ;java文件、class文件、jar文件这些东西混淆在一起的确很容易晕菜。我也是摸索了挺久,一条条来,说的不对请欢迎指正:

1.java文件通过javac编译工具编译变成 class文件。

2.java执行工具可以执行class文件。

3.sourcepath定义了源码文件搜索的“根路径”,可以设置多条根路径。

4.classpath定义了class文件搜索的“根路径”,可以设置多条根路径。

5.package关键字指明当前源文件和此文件被编译成class后的文件所在“相对路径”, package和电脑文件系统的目录其实是一个意思,比如 com.xx.yy 对应 Linux的 com/xx/yy 对应windows的com\xx\yy。但是注意一个问题,这个路径是相对的,因为没有根,根需要从sourcepath或classpath里面去找。

比如根 classpath = D:\A;D:\B。

那么完整的物理路径就可能是 D:\A\com\xx\yy 也可能是 D:\B\com\xx\yy

所以同属一个package的源码文件也即开头都用了 package com.xx.yy 的源码文件不一定非要在同一个物理目录下面。

6.javac编译过过程中遇到import语句,就会根据 “classpath + 相对路径”去找 class文件,根据“sourcepath+相对路径“去找源文件。规则是这样的:如果只有class文件,就直接用class文件。

如果只有源文件,就把源文件编译成class文件。

如果既有class文件又有源文件,就会检查文件修改的时间戳,如果class文件晚于源文件,就直接用class文件,如果早于源文件,就重新编译源文件。

另外关于找到的标准要满足两条:文件名必须跟类名一样。

文件里面package定义的相对路径必须和import定义的相对路径一样。

7.简单说一下class文件,前面提到的相对路径信息在源码中是package关键字指明的,class文件中也有这些信息,只不过不是在文件头部指明,而是直接内化成类全称了,看个例子:

源码:

package A;

public class Hello{

public static void main(String args[]){

System.out.println("Hello World!");

}

}

class文件 反编译效果:

public class A.Hello {

public A.Hello();

public static void main(java.lang.String[]);

}

注意 Hello类直接变成了 A.Hello,也就是类名称自动包含了路径信息。

8.java执行class文件时,遇到 如new、getstatic 等等需要创建类实例的相关指令时,就会加载相关的class文件(也称动态加载),那么jvm会去哪里找class文件呢?跟javac类似还是通过“classpath + 相对路径”去找。

9.jar文件就是把class文件以及相对目录结构打包而成的文件,感兴趣可以直接解压看看。

import package java_java初学者,如何理解package和import?相关推荐

  1. golang package 是什么意思?一份来自初学者的golang package体验指南

    如果你有其他语言的基础,可见性应该很好理解. java的可见性是通过public private来描述的. python的可见性是通过_some_var下划线来约定的. 本文翻译自:https://w ...

  2. java classpath import package 机制 @Java的ClassPath, Package和Jar

    java classpath import package 机制 從一個簡單的例子談談package與import機制 基本原則:為什麼需要將Java文件和類文件切實安置到其所歸屬之Package所對 ...

  3. node和npm是什么_什么是npm? 面向初学者的Node Package Manager教程

    node和npm是什么 This article should serve as an all-in-one essential guide for Node.js' favorite sidekic ...

  4. python 导包语法 import package as name 和 from package import name 的区别

    今天在导包的时候: # from easydict import EasyDict as edict # 成功 # import easydict.EasyDict as edict # 失败 结果: ...

  5. import json java_JAVA的JSON数据包装-博客园老牛大讲

    标签: 一.什么是json呢? { "id":"1", "username":"老牛大讲堂", "passwo ...

  6. python多级目录import_深入理解Python中import机制

    大型项目中为了维护方便,通常使用模块化开发,模块化的过程中,就会涉及到各种包或者模块的相互导入,即使是对于有多个项目的Python开发者来说, import 也会让人困惑!本文带你深入了解python ...

  7. can‘t load package: cannot find module providing package github.com/hyperledger/fabric/core/chaincod

    在执行fabric++源码编译时,出现以下问题: 直接make,报错 can't load package: cannot find module providing package github.c ...

  8. 多个数字数组_七个问题帮助初学者深入理解Java数组

    短文涨姿势,看了不白看,不关注等啥? 几乎所有的高级语言当中,都提供了一种叫做"数组"的东西,Java语言当然也不例外.我们通过数组可以很方便的存储和管理一组数据.因为在Java语 ...

  9. TexStudio编译报错“Critical Package xeCJK Error: The xeCJK package requires XeTeX to function. ..._criti”

    1 问题描述 今天在学习博士论文的模板时,出现了一个错误, Critical Package xeCJK Error: The xeCJK package requires XeTeX to func ...

最新文章

  1. 鸿蒙系统增加了什么功能,华为再发新版鸿蒙OS系统!新增超级终端功能:可媲美iOS系统...
  2. DL之DNN:基于Tensorflow框架对神经网络算法进行参数初始化的常用九大函数及其使用案例
  3. kubernetes1.4版本遇到的坑
  4. 寻找重复的子树 Find Duplicate Subtrees
  5. 把汇集多个json文件的txt进行分割,然后批量修改文件名后缀
  6. LeetCode 415. 字符串相加 (逢十进一模版字符处理)
  7. CentOS 7下安装QT5.8
  8. 如何更高效地学习3D视觉?
  9. CISCO路由器NAT-T与IPSec ×××配置实验【实践闯未来】
  10. [CEOI2008]order
  11. 【C++程序设计实践】实验十一
  12. linux 双mipii摄像头,Toybrick-开源社区-TB-RK3399ProD-imx258摄像头 mipi 错误
  13. Android长截屏(滚动截屏)实现原理
  14. Calendar根据输入的年份和周数计算该周的开始日期和结束日期
  15. java给word表格追加行_Java 使用Spire.Cloud.Word给Word文档添加表格
  16. phpstudy 运行PHP项目
  17. 微信支付之公众号发红包和企业付款
  18. groovy_流利的Groovy
  19. ElasticKibana 安装部署
  20. 用字体,每次都要先开软件,ifonts闪退?不好用怎么办

热门文章

  1. JS隐形数据类型转换注意事项
  2. iOS - Card Identification 银行卡号识别
  3. 大型网站技术学习-3. 容器Docker与kubernetes
  4. C++编译器默默编写并调用哪些函数
  5. 《Unix/Linux网络日志分析与流量监控》2014年11月底出版
  6. c#基础数据操作之遍历DataTable并输出
  7. python提取xml的所有框坐标_python 提取批量xml文件中的坐标信息存入txt文件 xml文件转txt文件...
  8. c语言中未声明的标识符要怎么办,vc ++未声明的标识符,虽然它已声明
  9. 条款6:明确拒绝编译器自动生成的函数
  10. 如何能写出,一份让 HR 认同的简历