抽象类、接口与包

来源:互联网 发布:linux安装控制面板 编辑:程序博客网 时间:2024/05/16 15:19
5.5
抽象类、接口与包
5.5.1
抽象类
假设我们要编写一个计算矩形、三角形和圆的面积与周长
的程序,若按前面所学的方式编程,我们必须定义四个类:圆
类、三角形类、矩形类和使用前三个类的公共类,它们之间没
有继承关系,如图5.4所示。程序写好后虽然能执行,但从程序
的整体结构上看,三个类之间的许多共同属性和操作在程序中
没有很好地被利用,致使重复编写代码,降低了程序的开发效
率,且使出现错误的机会增加。
第5章 消息、继承与多态
图5.4 具有相同特征却彼此独立的几个类
圆类
圆心座标
半径
计算面积
计算周长
三角形类
底边长

计算面积
计算周长
矩形类


计算面积
计算周长
第5章 消息、继承与多态
仔细分析上面例子中的三个类,可以看到这三个类都要计
算面积与周长,虽然公式不同但目标相同。因此,我们可以为
这三个类抽象出一个父类,在父类里定义圆、三角形和矩形三
个类共同的数据成员及成员方法。把计算面积与周长的成员方
法名放在父类给予说明,而具体的计算公式再在子类中实现。
如图5.5所示。这样,我们通过父类就大概知道子类所要完成的
任务,而且,这些方法还可以应用于求解平行四边形、梯形等
图形的周长与面积。这种结构就是抽象类的概念。
第5章 消息、继承与多态
图5.5 抽象类及其应用
圆类
圆心座标
半径
三角形类
底边长

计算面积
计算周长


抽象类
梯形类
计算面积
计算周长
抽象方法
计算面积
计算周长
矩形类
计算面积
计算周长
上、下底边
长高
第5章 消息、继承与多态
在Java程序中用抽象类(abstract class)来实现自然界的抽象概
念。抽象类的作用在于将许多有关的类组织在一起,提供一个公
共的类,即抽象类,而那些被它组织在一起的具体的类做为它的
子类由它派生出来。抽象类刻画了公有行为的特征,并通过继承
机制传送给它的派生类。在抽象类中定义的方法称为抽象方法,
这些方法只有方法头的声明,而用一个分号来代替方法体的定
义,即只定义成员方法的接口形式,而没有具体操作。只有派生
类对抽象成员方法的重定义才真正实现与该派生类相关的操作。
在各子类继承了父类的抽象方法之后,再分别用不同的语句和方
法体来重新定义它,形成若干个名字相同,返回值相同,参数列
表也相同,目的一致但是具体实现有一定差别的方法。抽象类中
定义抽象方法的目的是实现一个接口,即所有的子类对外都呈现
一个相同名字的方法。
第5章 消息、继承与多态
抽象类是它的所有子类的公共属性的集合,是包含一个或
多个抽象方法的类。使用抽象类的一大优点就是可以充分利用
这些公共属性来提高开发和维护程序的效率。对于抽象类与抽
象方法的限制如下:
(1) 凡是用abstract
修饰符修饰的类被称为抽象类。凡是用
abstract修饰符修饰的成员方法被称为抽象方法。
(2) 抽象类中可以有零个或多个抽象方法,也可以包含非抽
象的方法。
第5章 消息、继承与多态
(3) 抽象类中可以没有抽象方法,但是,有抽象方法的类必
须是抽象类。
(4) 对于抽象方法来说,在抽象类中只指定其方法名及其类
型,而不书写其实现代码。
(5) 抽象类可以派生子类,在抽象类派生的子类中必须实现
抽象类中定义的所有抽象方法。
(6) 抽象类不能创建对象,创建对象的工作由抽象类派生的
子类来实现。
第5章 消息、继承与多态
(7) 如果父类中已有同名的abstract方法,则子类中就不能再
有同名的抽象方法。
(8) abstract不能与final并列修饰同一个类。
(9) abstract 不能与private ,static,final或native并列修饰同一
个方法。
(10) abstract 类中不能有private的数据成员或成员方法。
第5章 消息、继承与多态
【示例程序c5_18.java】 抽象类应用。
import java.awt.*;
import java.applet. *;
abstract class Shapes //定义一个抽象类Shapes
{
public int x,y; //x、y为画图的坐标
public int width,height;
public Shapes(int x,int y,int width,int height)
{ this.x=x;
this.y=y;
this.width=width;
this.height=height;
}
第5章 消息、继承与多态
abstract double getArea( ); //求图形面积的抽象方法
abstract double getPerimeter( ); //求图形周长的抽象方法
}
class Square extends Shapes //由抽象类Shapes派生的子类——矩形类
{
public double getArea( ){return(width*height);}
public double getPerimeter( ){return(2*width+2*height);}
public Square(int x,int y,int width,int height)
{ super(x,y,width,height); }
}
class Triangle extends Shapes //由抽象类Shapes派生的子类——三角形类
{
第5章 消息、继承与多态
public double c; //斜边
public double getArea( ){return(0.5*width*height);}
public double getPerimeter( ){return(width+height+c);}
public Triangle(int x,int y,int base,int height)
{
super(x,y,base,height);
c=Math.sqrt(width*width+height*height);
}
}
class Circle extends Shapes //由抽象类Shapes派生的子类——圆类
{
第5章 消息、继承与多态
public double r; //半径
public double getArea( ){return(r*r*Math.PI);}
public double getPerimeter( ){return(2*Math.PI*r);}
public Circle(int x,int y,int width,int height)
{
super(x,y,width,height);
r=(double)width/2.0;
}
}
public class c5_18 extends Applet
{
第5章 消息、继承与多态
Square Box=new Square(5,15,25,25);
Triangle tri=new Triangle(5,50,8,4);
Circle Oval=new Circle(5,90,25,25);
public void paint(Graphics g)
{
//画正方形
g.drawRect(Box.x,Box.y,Box.width,Box.height);
g.drawString("Box Area:"+Box.getArea( ),50,35);
g.drawString("Box Perimeter:"+Box.getPerimeter( ),50,55);
g.drawString("tri Area:"+tri.getArea( ),50,75);
第5章 消息、继承与多态
g.drawString("tri Perimeter:"+tri.getPerimeter( ),50,95);
g.drawOval(Oval.x,Oval.y,Oval.width,Oval.height); //画圆
g.drawString("oval Area:"+Oval.getArea( ),50,115);
}
}
运行结果如图5.6所示。
从本例可以看出,类Square、类Circle及类Triangle都由抽象
类Shape派生而来,都实现了getArea 和getPerimeter抽象方法。
第5章 消息、继承与多态
图5.6 程序c5_18的运行结果
第5章 消息、继承与多态
5.5.2
接口
多重继承是指一个子类可以有多个直接父类,该子类可以全
部或部分继承所有直接父类的数据成员及成员方法。例如,冷藏
车既是一种汽车,也是一种制冷设备,所以它是汽车的子类也是
制冷设备的子类。自然界中这种多继承结构到处可见。
在面向对象的程序设计语言中,有些语言(如C++)提供了多继
承机制。而Java出于安全性、简化程序结构的考虑,不支持类间
的多继承而只支持单继承。然而在解决实际问题的过程中,在很
多情况下仅仅依靠单继承不能将复杂的问题描述清楚。为了使
Java程序的类间层次结构更加合理,更符合实际问题的本质,
Java
语言提供接口来实现多重继承机制。
第5章 消息、继承与多态
1
.声明接口
声明接口的格式如下:
[修饰符] interface接口名[extends 父接口名列表]
{
常量数据成员声明
抽象方法声明
}
第5章 消息、继承与多态
说明:
(1) interface是声明接口的关键字,可以把它看成一个特殊
类。
(2) 接口名要求符合Java标识符规定。
(3) 修饰符有两种:public 和默认。public修饰的接口是公共
接口,可以被所有的类和接口使用;默认修饰符的接口只能被
同一个包中的其他类和接口使用。
第5章 消息、继承与多态
(4) 父接口列表:接口也具有继承性。定义一个接口时可以
通过extends关键字声明该接口是某个已经存在的父接口的派生接
口,它将继承父接口的所有属性和方法。与类的继承不同的是一
个接口可以有一个以上的父接口,它们之间用逗号分隔。
(5) 常量数据成员声明:常量数据成员前可以有也可没有修
饰符。修饰符是public final static和fina1 static;接口中的数据成
员都是用 final修饰的常量,写法如下:
修饰符 数据成员类型 数据成员名=常量值

数据成员名=常量值
第5章 消息、继承与多态
例如:
public final static double PI=3.14159;
final static int a=9;
int SUM=100;(等价于final static int SUM=100;)
第5章 消息、继承与多态
(6) 抽象方法声明:接口中的方法都是用abstract修饰的抽象
方法。在接口中只能给出这些抽象方法的方法名、返回值和参
数列表,而不能定义方法体,即这些接口仅仅是规定了一组信
息交换、传输和处理的“接口”。格式如下:
返回值类型 方法名(参数列表);
其中:接口中的方法默认为public abstract方法。接口中方
法的方法体可以由Java语言书写,也可以由其他语言书写。方
法体由其他语言书写时,接口方法由native修饰符修饰。
第5章 消息、继承与多态
从上面的格式可以看出,定义接口与定义类非常相似。实
际上完全可以把接口理解成为一种特殊的类,由常量和抽象方
法组成的特殊类。一个类只能有一个父类,但是它可以同时实
现若干个接口。这种情况下,如果把接口理解成特殊的类,那
么这个类利用接口实际上就获得了多个父类,即实现了多重继
承。
接口定义仅仅是实现某一特定功能的一组功能的对外接口
和规范,而不能真正地实现这个功能,这个功能的真正实现是
在“继承”这个接口的各个类中完成的,即要由这些类来具体定义
接口中各抽象方法的方法体。因而在Java中,通常把对接口功能
的“继承”称为“实现”。
第5章 消息、继承与多态
2
.定义接口注意事项
定义接口要注意以下几点:
(1) 接口定义用关键字interface,而不是用class。
(2) 接口中定义的数据成员全是final static,即常量。
(3) 接口中没有自身的构造方法,所有成员方法都是抽象
方法。
(4) 接口也具有继承性,可以通过extends关键字声明该接
口的父接口。
第5章 消息、继承与多态
3.
类实现接口的注意事项
一个类要实现接口,即一个类要调用多个接口时,要注意
以下几点:
(1) 在类中,用implements关键字就可以调用接口。一个类
若要调用多个接口时,可在implements后用逗号隔开多个接口的
名字。
(2) 如果实现某接口的类不是abstract的抽象类,则在类的定
义部分必须实现指定接口的所有抽象方法,即为所有抽象方法
定义方法体,而且方法头部分应该与接口中的定义完全一致,
即有完全相同的返回值和参数列表。
第5章 消息、继承与多态
(3) 如果实现某接口的类是abstract的抽象类,则它可以不实
现该接口所有的方法。但是对于这个抽象类的任何一个非抽象
的子类而言,它们的父类所实现的接口中的所有抽象方法都必
须有实在的方法体。这些方法体可以来自抽象的父类,也可以
来自子类自身,但是不允许存在未被实现的接口方法。这主要
体现了非抽象类中不能存在抽象方法的原则。
(4) 接口的抽象方法的访问限制符都己指定为public,所以
类在实现方法时,必须显式地使用public修饰符,否则将被系统
警告为缩小了接口中定义的方法的访问控制范围。
第5章 消息、继承与多态
【示例程序c5_19.java】 将例c5_18.java改写为接口程序。
import java.awt.*;
import java.applet.*;
interface Shapes//定义一个接口
{
abstract double getArea( );
abstract double getPerimeter( );
}
class Square implements Shapes //类要实现接口
{
第5章 消息、继承与多态
public int x,y;
public int width,height;
public double getArea( ){return(width*height);}
public double getPerimeter( ){return(2*width+2*height);}
public Square(int x,int y,int width,int height)
{
this.x=x;
this.y=y;
this.width=width;
this.height=height;
}
}
第5章 消息、继承与多态
class Triangle implements Shapes //类要实现接口
{
public int x,y;
public int width,height;
public double c;
public double getArea( ){return(0.5*width*height);}
public double getPerimeter( ){return(width+height+c);}
public Triangle(int x,int y,int base,int height)
{
第5章 消息、继承与多态
this.x=x;
this.y=y;
width=base;
this.height=height;
c=Math.sqrt(width*width+height*height);
}
}
class Circle implements Shapes //类要实现接口
{
第5章 消息、继承与多态
public int x,y;
public int width,height;
public double r;
public double getArea( ){return(r*r*Math.PI);}
public double getPerimeter( ){return(2*Math.PI*r);}
public Circle(int x,int y,int width,int height)
{
this.x=x;
this.y=y;
this.width=width;
this.height=height;
r=(double)width/2.0;
}
}
第5章 消息、继承与多态
public class c5_19 extends Applet
{ Square Box=new Square(5,15,25,25);
Triangle tri=new Triangle(5,50,8,4);
Circle Oval=new Circle(5,90,25,25);
public void paint(Graphics g)
{
g.drawRect(Box.x,Box.y,Box.width,Box.height);
g.drawString("Box Area:"+Box.getArea( ),50,35);
g.drawString("Box Perimeter:"+Box.getPerimeter( ),50,55);
g.drawString("tri Area:"+tri.getArea( ),50,75);
g.drawString("tri Perimeter:"+tri.getPerimeter( ),50,95);
g.drawOval(Oval.x,Oval.y,Oval.width,Oval.height);
g.drawString("oval Area:"+Oval.getArea( ),50,115);
}
}
第5章 消息、继承与多态
图5.7 程序c5_19的运行结果
第5章 消息、继承与多态
【示例程序c5_20.java】 将例c5_19.java改写为既有继承类又有接口的程序。
import java.awt.*;
import java.applet.*;
interface Shapes
{ abstract double getArea( );
abstract double getPerimeter( );
}
class Coordinates
{
int x,y;
public Coordinates(int x,int y)
{
this.x=x;
this.y=y;
}
}
第5章 消息、继承与多态
//Square Coordinates Shapes
class Square extends Coordinates implements Shapes
{
public int width,height;
public double getArea( ){return(width*height);}
public double getPerimeter( ){return(2*width+2*height);}
public Square(int x,int y,int width,int height)
{
super(x,y);
this.width=width;
this.height=height;
}
}
第5章 消息、继承与多态
class Triangle extends Coordinates implements Shapes
{
public int width,height;
public double c;
public double getArea( ){return(0.5*width*height);}
public double getPerimeter( ){return(width+height+c);}
public Triangle(int x,int y,int base,int height)
{
super(x,y);
width=base;
this.height=height;
c=Math.sqrt(width*width+height*height);
}
}
第5章 消息、继承与多态
class Circle extends Coordinates implements Shapes
{
public int width,height;
public double r;
public double getArea( ){return(r*r*Math.PI);}
public double getPerimeter( ){return(2*Math.PI*r);}
public Circle(int x,int y,int width,int height)
{
super(x,y);
this.width=width;
this.height=height;
r=(double)width/2.0;
}
}
第5章 消息、继承与多态
public class c5_20 extends Applet
{
Square Box=new Square(5,15,25,25);
Triangle tri=new Triangle(5,50,8,4);
Circle Oval=new Circle(5,90,25,25);
public void paint(Graphics g)
{
g.drawRect(Box.x,Box.y,Box.width,Box.height);
g.drawString("Box Area:"+Box.getArea( ),50,35);
g.drawString("Box Perimeter:"+Box.getPerimeter( ),50,55);
g.drawString("tri Area:"+tri.getArea( ),50,75);
g.drawString("tri Perimeter:"+tri.getPerimeter( ),50,95);
g.drawOval(Oval.x,Oval.y,Oval.width,Oval.height);
g.drawString("oval Area:"+Oval.getArea( ),50,115);
}
}
运行结果与示例程序c5_19.java的相同。
第5章 消息、继承与多态
5.5.3
包与程序复用
前面已介绍过,Java语言提供了很多包,例如,Java.io 、
Java.awt 、Java lang等, 这些包中存放着一些常用的基本类,
如System类、String类、Math类等,它们被称为Java类库中的包。
使用这些包使我们的编程效率大大提高。大家不妨想一想,直
接使用Java类库中Math.sqrt( )方法求解任意非负实数的平方根与
自己动手编写这个程序,哪个效率高?在许多场合反复使用那
些早已编写好的,且经过严格测试的程序的技术被称为软件复
用,在面向对象的程序设计中称为对象复用。
第5章 消息、继承与多态
对象复用是面向对象编程的主要优点之一,它是指同一对象
在多个场合被反复使用。在Java语言中,对象是类的实例,类是
创建对象的模板,对象是以类的形式体现的。因此,对象复用也
就体现在类的重用上。
利用面向对象技术开发一个实际的系统时,编程人员通常需
要定义许多类共同工作,且有些类可能要在多处反复使用。在
Java程序中,如果要想使一个类在多个场合下反复使用,可以把
它存放在一个称之为“包”的程序组织单位中。可以说,包是接口
和类的集合,或者说包是接口和类的容器。使用包有利于实现不
同程序间类的重用。Java语言为编程人员提供了自行定义包的机
制。
第5章 消息、继承与多态
包的作用有两个:一是划分类名空间,二是控制类之间的
访问。这就需要我们注意下述两点。第一,包是一个类名空
间,所以,同一个包中的类(包括接口)不能重名,不同包中的
类可以重名。第二,类之间的访问控制是通过类修饰符来实现
的,若类声明修饰符为public,则表明该类不仅可供同一包中的
类访问,也可以被其他包中的类访问。若类声明无修饰符,则
表明该类仅供同一包中的类访问。
第5章 消息、继承与多态
1.
创建包
包的创建就是将源程序文件中的接口和类纳入指定的包。在
一般情况下Java源程序的构成由四部分组成:
(1) 一个包(package)说明语句(可选项)。其作用是将本源文件
中的接口和类纳入指定包。源文件中若有包说明语句,必须是第
一个语句。
(2) 若干个(import)语句(可选项)。其作用是引入本源文件中
需要使用的包。
(3) 一个public的类声明。在一个源文件中只能有一个public
类。
(4) 若干个属于本包的类声明(可选)。
第5章 消息、继承与多态
包的声明语句格式:
package
包名;
利用这个语句就可以创建一个具有指定名字的包,当
前.java
文件中的所有类都被放在这个包中。例如下面的语句是
合法的创建包的语句:
package shape;
package shape.shapeCircle;
第5章 消息、继承与多态
创建包就是在当前文件夹下创建一个子文件夹,存放这个
包中包含的所有类的.class文件。package shape.shapeCircle;语
句中的符号“.”(注意不是“,”)代表了目录分隔符,说明这
个语句创建了两个文件夹:第一个是当前文件夹下的子文件夹
shape;第二个是shape下的子文件夹shapeCircle,当前包中的所
有类就存放在这个文件夹(ShapeCircle)里。
若源文件中未使用package,则该源文件中的接口和类位于
Java的无名包中(无名包又称缺省包),它们之间可以相互引用非
private的数据成员或成员方法。无名包中的类不能被其他包中
的类引用和复用。
第5章 消息、继承与多态
【示例程序c5_21.java】 改写示例程序c5_20.java,将接口
与类纳入包。
第一步,建立5个源文件,文件的接口与类都属于包shape。
设这些文件都存入当前文件夹d:/myjava中。
(1) 名为Shapes.java的文件为:
package shape;
public interface Shapes
{ abstract double getArea( );
abstract double getPerimeter( );
}
第5章 消息、继承与多态
(2) 名为Coordinates.java的文件为:
package shape;
class Coordinates
{ public int x,y;
public Coordinates(int x,int y)
{ this.x=x;
this.y=y;
}
}
第5章 消息、继承与多态
(3) 名为Square.java的文件为:
package shape;
public class Square extends Coordinates implements Shapes
{
public int width,height;
public double getArea( ){return(width*height);}
public double getPerimeter( ){return(2*width+2*height);}
public Square(int x,int y,int width,int height)
{
super(x,y);
this.width=width;
this.height=height;
}
}
第5章 消息、继承与多态
(4) 名为Triangle.java的文件为:
package shape;
public class Triangle extends Coordinates implements Shapes
{
public int width,height;
public double c;
public double getArea( ){return(0.5*width*height);}
public double getPerimeter( ){return(width+height+c);}
public Triangle(int x,int y,int base,int height)
{
super(x,y);
width=base;
this.height=height;
c=Math.sqrt(width*width+height*height);
}
}
第5章 消息、继承与多态
第二步,对上面的5个文件进行编译。
d:/myjava>javac - d d:/myjava Shapes.java
d:/myjava>javac - d d:/myjava Coordinates.java
d:/myjava>javac - d d:/myjava Triangle.java
d:/myjava>javac - d d:/myjava Square.java
d:/myjava>javac - d d:/myjava Circle.java
在编译过程中,若不存在d:/myjava/shape文件夹,则系统自
动创建此文件夹。编译命令中的“-d”是编译开头,其作用是通知
javac将编译好的类文件(.class)存入文件夹 d:/myjava/shape中。
第5章 消息、继承与多态
第三步,shape包的引用。
建立一个引用程序:c5_21.java,并将该程序存放在
d:/myjava文件夹中。
package p2;
import java.awt.*;
import java.applet.*;
import shape.*; //引入我们创建的包
public class c5_21 extends Applet
{
第5章 消息、继承与多态
Square Box=new Square(5,15,25,25);
Triangle tri=new Triangle(5,50,8,4);
Circle Oval=new Circle(5,90,25,25);
public void paint(Graphics g)
{
g.drawRect(Box.x,Box.y,Box.width,Box.height);
g.drawString("Box Area:"+Box.getArea( ),50,35);
g.drawString("Box Perimeter:"+Box.getPerimeter( ),50,55);
g.drawString("tri Area:"+tri.getArea( ),50,75);
g.drawString("tri Perimeter:"+tri.getPerimeter( ),50,95);
g.drawOval(Oval.x,Oval.y,Oval.width,Oval.height);
g.drawString("oval Area:"+Oval.getArea( ),50,115);
}
}
第5章 消息、继承与多态
使用下述命令编译该程序:
d:/myjava>javac -d d:/myjava c5_21.java
对其编译时,javac从环境变量CLASSPATH(类似于DOS操
作系统中的PATH,它指明所有缺省的类字节码文件路径)提供的
路径去搜索名为shape的子目录,找到后引用该文件夹下的“.class”
文件。编译结束后,在文件夹d:/myjava/p2下产生c5_21.class文件。
由于类属于p2包,在执行c5_21.class时应在c5_21.class前加包名
和小数点。见下面两行列出的c5_21.html文件内容。
<APPLET CODE="p2.c5_21.class" width=150 height=100>
</APPLET>
运行结果与c5_20.java相同。
第5章 消息、继承与多态
2
.包的引用
将类组织成包的目的是为了更好地利用包中的类。通常一
个类只能引用与它在同一个包中的类。如果需要使用其他包中
的public类,则可以使用如下的几种方法。
(1) 在引入的类前加包名。
一个类要引用其他类有两种方式:一是对于同一包中的其
他类可直接引用,如c5_18.java中的引用。二是对于不同包中的
其他类引用时需在类名前加包名,例如,若你的源文件中要引
用包shape中的类Circle,可在源文件中的Circle之前加
“shape.”,如shape.Circle c=new shape.Circle(25,25,5,3)。这种类
名前加包名的引用方式适用于在源文件中使用少的情况。
第5章 消息、继承与多态
(2) 用import关键字加载需要使用的类。
上面的方法使用起来比较麻烦,还可以在当前程序中利用
import关键字加载需要使用的类,这样在程序中引用这个类的地
方就不需要再使用包名作为前缀。例如上面的语句在程序开始
处增加了:
import shape.Circle ;//在程序开始加载其他包的类
语句之后,就可以直接写成:
Circle c=new Circle(25,25,5,3);
第5章 消息、继承与多态
(3) 用import关键字加载整个包。
上面的方法利用import语句加载了其他包中的一个类。若希
望引入整个包也可以直接利用import语句。加载整个包的import
语句可以写为:
import shape.*;
import java.awt.*;
上面第一个语句见c5_21.java例,第二个语句在前面的例子
中已多次使用,它的作用是把Java系统有关抽象窗口工具的包(系
统类库)加载到当前程序中。与加载单个类相同,加载整个包
后,凡是用这个包中的类,都不需要再使用包名前缀。
第5章 消息、继承与多态
(4) 设置CLASSPATH环境变量。
包是一种组织代码的有效手段,包名实际上就指出了程序
中需要使用的.class文件的所在之处。另一个能指明.class文件夹
所在结构的是环境变量CLASSPATH。当一个程序找不到它所
需使用的其他类的.class文件时,系统会自动到CLASSPATH环
境变量所指明的路径中去寻找。
设置CLASSPATH环境变量可以通过编辑系统的
AUTOEXEC.BAT文件,或使用相关的DOS命令。例如下面的语

SET CLASSPATH=c:/jdk1.3.1/lib/tools.jar;
第5章 消息、继承与多态
将c:/jdk1.3.1/lib/tools.jar设置为当前CLASSPATH目录。
对于Java Application程序,还可以通过为Java解释器设置
参数来指定类文件路径。例如,对于JDK中的Java解释器
java.exe,有开关参数-classpath。假设当需要解释执行的
test.class文件不在当前目录而在C盘的TEMP目录下时,可以使
用如下的命令行语句
java test -classpath c:/temp
来运行这个程序。