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
能够被编译,但是不能被解释器解释。
1
import java.util.*;
2![](/Images/OutliningIndicators/None.gif)
3
public class EmployeeTest
4![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
5
public static void main(String[] args)
6![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
7
Employee[] staff = new Employee[3];
8![](/Images/OutliningIndicators/InBlock.gif)
9
staff[0] = new Employee("Carl Cracker", 75000, 1987, 12, 15);
10
staff[1] = new Employee("Harry Hacker", 50000, 1989, 10, 1);
11
staff[2] = new Employee("Tony Tester", 40000, 1990, 3, 15);
12![](/Images/OutliningIndicators/InBlock.gif)
13
for (Employee e : staff)
14
e.raiseSalary(5);
15![](/Images/OutliningIndicators/InBlock.gif)
16
for (Employee e : staff)
17![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
18
System.out.println("name=" + e.getName() + ",salary=" + e.getSalary() + ",hireDay=" + e.getHireDay());
19
}
20
}
21
}
22![](/Images/OutliningIndicators/None.gif)
23
class Employee
24![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
25
public Employee(String n, double s, int year, int month, int day)
26![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
27
name = n;
28
salary = s;
29
GregorianCalendar calendar = new GregorianCalendar(year, month - 1, day);
30
hireDay = calendar.getTime();
31
}
32![](/Images/OutliningIndicators/InBlock.gif)
33
public String getName()
34![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
35
return name;
36
}
37![](/Images/OutliningIndicators/InBlock.gif)
38
public double getSalary()
39![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
40
return salary;
41
}
42![](/Images/OutliningIndicators/InBlock.gif)
43
public Date getHireDay()
44![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
45
return (Date)hireDay.clone();
46
}
47![](/Images/OutliningIndicators/InBlock.gif)
48
public void raiseSalary(double byPercent)
49![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
50
double raise = salary * byPercent / 100;
51
salary += raise;
52
}
53![](/Images/OutliningIndicators/InBlock.gif)
54
private String name;
55
private double salary;
56
private Date hireDay;
57
}
代码片段二:
D:\java\PackageTest.java
D:\java\com\localhost\corejava\Employee.java
不能够被编译,也不能被解释器解释。
1
import com.localhost.corejava.*;
2
import static java.lang.System.*;
3![](/Images/OutliningIndicators/None.gif)
4
public class PackageTest
5![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
6
public static void main(String[] args)
7![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
8
Employee harry = new Employee("Harry", 50000, 1981, 10, 1);
9
harry.raiseSalary(5);
10
out.println("name=" + harry.getName() + " salary=" + harry.getSalary());
11
}
12
}