JACKY-J2EE

The best way to predict the future is to invent it.
posts - 0, comments - 0, trackbacks - 0, articles - 1
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

关于虚拟机如何定位的疑问?

Posted on 2007-12-13 16:24 jacky-j2ee 阅读(188) 评论(0)  编辑  收藏

在阅读CORE JAVA中虚拟机如何定位类一节中P.131,设置一个包是的定义是:
package com.localhost.corejava
则包的目录是:
com/localhost/corejava
要使用包的类,或者使程序共享包要做到一下方面:
第一是把类放在指定的目录中。例如d:\java目录是基目录,则希望使用com.localhost.corejava.Employee类,就不必须定位于子目录d:\java\com\localhost\corejava中。
第二是设置类路径,类路径是指所有基目录的集合。

设置类路径可以设置CLASSPATH环境变量或者使用编译器和解释器的-classpath选项。

类路径包括
1.基目录
2.当前目录(.)
3.JAR文件
运行时库文件会被自动的搜索,不必显示的设置。

按照书上说javac编译器总是在当前文件中查找文件,而java解释器仅在类路径中有"."目录的时候,才查看当前目录。如果没有设置类路径,并不会产生什么问题,默认的路径包含当前路径。然而如果设置了类路径但是没有包含"."目录,程序仍然可以通过编译,但是不能运行。

经过测试发现:
设置CLASSPATH=C:\JLIB
D:\Java>javac PackageTest.java
PackageTest.java:1: 软件包 com.localhost.corejava 不存在
import com.localhost.corejava.*;
^
PackageTest.java:8: 找不到符号
符号: 类 Employee
位置: 类 PackageTest
Employee harry = new Employee("Harry", 50000, 1981, 10, 1);
^
PackageTest.java:8: 找不到符号
符号: 类 Employee
位置: 类 PackageTest
Employee harry = new Employee("Harry", 50000, 1981, 10, 1);
^
3 错误

设置CLASSPATH=.;C:\JLIB
或者执行D:\Java>javac -classpath . PackageTest.java通过了编译,java解释器也是同样。

既然javac编译器总是在当前文件中查找文件,为什么编译会不通?继续研究......


2007-12-14:
当CLASSPATH=C:\JLIB
发现javac编译器会搜索当前目录但是只是当前目录中是否存在类,在有自定义包的情况下仍然不能被编译成功,没有自定义包的情况下编译通过。但是java解释器无法搜索到Employee类,因为CLASSPATH=C:\JLIB。在CLASSPATH中再加入当前目录就能够被编译和解释了。

代码片段一:D:\java\EmployeeTest.java
能够被编译,但是不能被解释器解释。

 1import java.util.*;
 2
 3public class EmployeeTest
 4{
 5    public static void main(String[] args)
 6    {
 7        Employee[] staff = new Employee[3];
 8
 9        staff[0= new Employee("Carl Cracker"7500019871215);
10        staff[1= new Employee("Harry Hacker"500001989101);
11        staff[2= new Employee("Tony Tester"400001990315);
12
13        for (Employee e : staff)
14            e.raiseSalary(5);
15
16        for (Employee e : staff)
17        {
18            System.out.println("name=" + e.getName() + ",salary=" + e.getSalary() + ",hireDay=" + e.getHireDay());
19        }

20    }

21}

22
23class Employee
24{
25    public Employee(String n, double s, int year, int month, int day)
26    {
27        name = n;
28        salary = s;
29        GregorianCalendar calendar = new GregorianCalendar(year, month - 1, day);
30        hireDay = calendar.getTime();
31    }

32
33    public String getName()
34    {
35        return name;
36    }

37
38    public double getSalary()
39    {
40        return salary;
41    }

42
43    public Date getHireDay()
44    {
45        return (Date)hireDay.clone();
46    }

47
48    public void raiseSalary(double byPercent)
49    {
50        double raise = salary * byPercent / 100;
51        salary += raise;
52    }

53
54    private String name;
55    private double salary;
56    private Date hireDay;
57}

代码片段二:
D:\java\PackageTest.java
D:\java\com\localhost\corejava\Employee.java
不能够被编译,也不能被解释器解释。
 1import com.localhost.corejava.*;
 2import static java.lang.System.*;
 3
 4public class PackageTest
 5{
 6    public static void main(String[] args)
 7    {
 8        Employee harry = new Employee("Harry"500001981101);
 9        harry.raiseSalary(5);
10        out.println("name=" + harry.getName() + " salary=" + harry.getSalary());
11    }

12}

只有注册用户登录后才能发表评论。


网站导航: