小女在学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。