java命令和javac命令

在命令行中使用java来运行java程序,搜索类的过程分为以下3步:

1 搜索系统类,大部分都位于JAVA_HOME/jre/lib/rt.jar中

2 搜索扩展类,即那些位于JAVA_HOME/jre/lib/ext下的.jar文件中的类

3 搜索用户类路径 即环境变量CLASSPATH或者在命令行中由java指令的-cp选项指定,如果不指定-cp,那么CLASSPAT环境变量起作用;如果指定了-cp,那么只有-cp指定的类路径起作用。

注意:搜索系统类和扩展类是java虚拟机自动进行的,换句话说,即使环境变量CLASSPATH和java指令的-cp选项没有指定这两个路径,java虚拟机也会自动搜索。

 

下面以一个具体例子来说明,结合import语句,某一个类是如何被找到的。

假设在d:example\src文件夹下存放着java程序的源文件,文件层次结构如下:

d:\example\src\test\A.java

d:\example\src\test\B.java

这两个源文件的代码如下:

 

package test;

import java.util.*;
public class A {
	
	public static void main(String[] args) {
		Date date = new Date();
		B.say();
	}
}

 

package test;

public class B {
	public static void say() {
		System.out.println("Hello");
	}
}

 

 

假设已经编译好了,在d:\example\classes文件下存放着要运行的类文件,其中A.class和B.class都位于test包中,文件层次结构

如下:

d:\example\classes\test\A.class

d:\example\classes\test\B.class

要运行这个程序,在命令行中切换到d:\example目录,即

 


 
 然后,键入如下命令:



 运行程序后就会输出Hello字符串。

其中类的搜寻过程如下:

1 为了找到A.class,虚拟机首先搜索系统类路径和扩展类路径但是找不到,接着搜索用户类路径,由于在java指令中使用了-cp选项,因此,虚拟机以当前工作目录(即命令行调用java指令时所在目录d:\example) + -cp指定的路径(classes) + 包名(test)构成的路径下搜索,d:\example\classes\test下搜索A.class,结果能够找到A.class(-cp所给的相对路径是相对于当前工作目录的,也可以指定绝对路径)

2 A.class引用了Date类,由于在使用Date类时没有指定Date类所在包,那么,虚拟机搜索时会结合所有的import语句,这里import语句java.util.*。

虚拟机在搜索系统类路径时,根据import语句,在JAVA_HOME/jre/lib/rt.jar/java/util文件夹下找到Date类

3 A.class引用了B.class,由于在使用B类时没有指定B类所在包,那么虚拟机搜索时会结合所有的import语句,这里import语句为java.util.*。但是虚拟机无论是结合import语句搜索系统类路径和扩展类路径,还是结合import语句搜索

用户类路径都找不到B.class,这时虚拟机会根据A.class所在的包(test)来构造路径搜索,在d:\example\classes\test中找到B.class文件。

注意:在第3步搜索B.class时,如果在A.java源文件中添加import test.*;语句也是可以的。

 

在命令行中用javac编译java源文件,javac既搜索类文件(过程和java指令一样),也搜索java源文件。以在命令行中编译d:\example\src\test\A.java

为例,只要键入以下命令即可:



 javac会进行如下搜索,

1 搜索源文件A.java,首先从当前工作目录(即运行javac指令时命令行所处的

目录,即d:\example),结合指定的源文件路径(src/test)搜索A.java,结果

在d:\example\src\test下发现A.java

2 搜索Date类,搜索Date类和java指令中搜索一样,结合import语句,最终

在系统类路径JAVA_HOME/jre/lib/rt.jar/java/util下找到Date.class

3 搜索B.java源文件,源文件的搜索路径由-sourcepath指定,具体搜索过程为,结合所有import语句搜索,即搜索d:\example\src\java\util,不能搜索到B.java,在结合A.java声明的包(test)进行搜索,即搜索d:\example\src\test,结果找到B.java(-sourcepath指定的相对路径也是相对于当前目录的,也可以指定绝对路径)

注意:

1 javac也可以有-cp选项,作用和java指令中的一样

2 如果javac指定了-cp没有指定-sourcepath,那么-cp既起到指定用户类路径的作用,也起到指定源文件搜索路径的作用;但是如果javac既指定了-cp,又指定了-sourcepaht,那么-cp只起到指定用户类路径的作用,-sourcepath只起到指定源文件搜索路径的作用

3 javac的-d选项指定生成的类文件存放位置,这里存放于(d:\example\classes)


 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值