senline

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

小女在学oop,用到java。老师让他们使用命令行编译代码,执行程序。碰到问题,原因是不大明白java虚拟查找类的规则。我对java也不熟,查资料,问同事,做实验,总结如下。

----------------------

javac.exe 是java 编译器,可以将 java代码翻译成电脑可执行的机器码,保存在.class文件中(每个class一个独立的.class文件),严格讲是java虚拟机可执行的伪机器码;java.exe 是java虚拟机程序,可以执行 javac编译好的java程序。

java 执行java程序最简单的命令是:java class_name,比如 java HelloWord(注意类名前要加上其所在的package名称,比如com.company.HelloWorld。)。java虚机会查找类并调用其中的main函数。,java 如果找不到 HelloWord这个类,就会报错误:Error: Could not find or load main class HelloWorld。

java 虚机怎么根据你指定的类名找这个类的程序呢。
java 的类可以存在两类文件中:
1,.class文件。这是 .java 程序经过 javac 编译后生成的,称为java类文件。
2,.jar 文件中,俗称jar包。是一系列.class 的集合,就是把很多 编译好的类文件放在一个文件中(包中)
所以虚拟执行java程序就有两种方法:
java class_name 或者 java -jar package_name。

我们只说第一种,这种语法,java 会从磁盘上查找.class文件,找到类代码执行之。比如 你写 java com.company.HelloWorld, java虚机就会从 .class文件中 找HelloWorld类。
java 到哪里找包含 HelloWorld 这个类的.class文件呢。它需要知道类文件存放的位置。它确定类文件位置的规则如下:
1,如果你在命令中,指定了类所在目录(用 -classpath <path>),它就只找<path>目录
比如:java -classpath d:\javaexc HelloWorld,java 会在 d:\javaex 下查找类文件
2,如果没有使用 classpath 参数,就从当前目录找,就是你执行java.exe 时的目录。比如上图中的 c:\Users\HP

3,如果当前目录下没有,就从环境变量 CLASSPATH定义的目录中找。

根据以上规则,我们假设java c:\javaexc 是其中的一个类存放目录,严格来讲他是以这个目录作为存放.class文件的根目录。为什么说是根目录呢,是因为如果你在定义类的时候,指定了package 名称,比如 package com.company,java就会到 c:\javaexc\com\company 目录下查找。比如你在 c:\javaexc 下执行 java com.company.HelloWorld,它会到  c:\javaexc\com\company  查找 .class文件,如果你执行 java HelloWorld,它则在 c:\javaexc 下查找 .class文件。

定位到类目录后,java会遍历目录下的所有.class文件,挨个看里边有没有 HelloWorld这个类,直到找到为止。

如果还找不到,就报图中的错误:Error: Could not find or load main class xxx。

 

posted on 2022-03-04 10:40  森蓝2010  阅读(87)  评论(0编辑  收藏  举报