在创建应用程序第一部分, 您学习了什么 是应用对象以及如何把对象的设计编写到被称之为类的文件中。此外,您还学到了 如何使用JAVATMAPI中预定义的类,以及如何通 过调用预定义或自定义的方法来操作对象。
至此,您已经创建了潜水日志应用的第一个类和一些由 DiveLog.java初始化出来的,空的占位符类。
第二部分将进一步强化有关概念,并引进“Welcome”为类,内容包括:
开始教程
在第一部分中,您已经创建了类“ DiveLog”, 它包含了一个可以为潜水日志应用生成框架的构造函数、一个JMenu, 并初始化了带有六个已命名标签的JTabbedPane对象。每一个标签都 从占位符类生成了一个对象,但都是空的。
这部分教程中将用到一些图像以及Welcome.java这个占位符类的 知识。您可以不使用本教程提供的图像,但为了防止布局发生问题,来源于其它提 供者的图像大小应该与本教程提供的完全一样。在您继续学习本教程时,会发现有 很多方法可以定制您的应用程序及其布局。
- 将下列图像保存到
divelog/images目录中: divelog/images
diveflag.gif
Image size: 32 by 32 pixels.
diver.jpg
Image size: 393 by 187 pixels.
- 或创建一个自定义的图像,但图像大小应该和上述像素值相同。
|
注意:本教程假设您已经在系统上安装了 JavaTM 2平台标准版,并且已经完成了对创建 应用程序教程的第一部分的学习。
继承
应用可以由单一类构成,但是大多数应用都包含多个类。这些构成应用的类通常 使用点操作符通过引用一个对象和方法来进行通信。您已经看到了有关DiveLog 类的范例:
dlframe.setSize(765, 690);
在这个范例中,dlframe就是对象“JFrame”( 您 所创建的)引用变量,但是类“JFrame”没有定义被称之为 “setSize”的方法。那么,这种方法是从哪里来呢?如果JFrame 类没有定义方法, JFrame对象怎么来实现对它的调用呢?事实上, 这个过程与您的头发颜色是如何从您的母亲或父亲那里遗传过来的过程有些类似 ——都是通过继承。但是,JAVA类的继承使得开发人员对子类拥有很高的控制权, 这一点远远高于人类的继承。
因为您已经初始化了一个JFrame类型的对象,所以DiveLog 类可以继承所有JFrame的方法。此外,DiveLog类还可 以继承JFrame从其它类继承下来的方法。JFrame类可 以从等级树(hierarchy tree)上边的类中继承方法与字段:

JFrame类等级树 |
所有的类都可以从类“Object”中自动继承。此外,当您创建一 个JFrame类型的对象时,新对象同样可以从类“Frame”、 “Window”、“Container”、以及“Component” 中继承。要调用来自于被继承类中的方法时,您通常使用带有引用变量的点操作符。 方法“setSize”是从类“Component”中继承而来的。
并不是所有被继承的方法和字段都是可访问的,尽管它们是对象的组成部分。随 后,您会学到更多有关如何从父类中访问特定数据类型的知识。
有一种更直接的方法可以从特定类中进行继承:在类声明中使用关键字“ extends”。使用extends,您的子类(有时也被称为 派生类)就可以从父类或超类中进行继承,从而使您无须:
- 初始化所需的被继承类来获得其方法与字段。
- 使用一个带有变量引用和点操作符来调用超类中的方法。
换句话说,关键字“extends”允许从选定的类进行继承,而不像 人类的遗传——只能无条件的从双亲那里继承。
要使得DiveLog类成为JFrame类的子类,您需要这 样写:
public class DiveLog extends JFrame
现在,您已经指定了子类所要继承的类,从而使子类自身与父类的类型一致。使 用上述语句,您就可以将DiveLog类指定为JFrame对象 的类型,就如同拉布拉多小猎狗属于拉布拉多类型一样。
通过扩展JFrame类,您就无须像上一课那样,为了获取JFrame 的方法,还必须在自义的类中对其进行实例化:
dlframe.addWindowListener(new WindowAdapter()
dlframe.getContentPane().add(tabbedPane);
dlframe.setJMenuBar(mb);
事实上,调用方法可以无须变量“dlframe”。您可以通过名字来 调用所继承的方法:
getContentPane().add(tabbedPane);
addWindowListener(new WindowAdapter()
getContentPane().add(tabbedPane);
setJMenuBar(mb);
父类“JFrame”中有一个构造函数,可以通过使用关键字 “super”来进行调用。DiveLog可以调用父类 “JFrame”的构造函数,并提供在框架窗口顶部出现的字符串:
super("A Java(TM) Technology Dive Log");
在人类的遗传继承中,您从母亲和父亲那里获得些基因,而对于类继承,通过使 用关键字“extends”, “DiveLog” 对象不但可以 获得 “JFrame” 对象的功能,还将拥有您添加的其它功能。换句话 说, “DiveLog” 对象拥有比 “JFrame” 对象更多 的功能。从JFrame对象派生的 “DiveLog” 对象除了 具有带标题的框架外,还有:
- 一个“
TabbedPane”对象
- 带有标题的标签
- 为占位符类保留的内存,在那里您可以创建更多的对象。
要对类进行改进,可以将方法setSize(765, 690)、 setBackground(Color.white)以及setVisible(true) 移动到main方法中。因为DiveLog是一种frame 对象,所以可以对一个刚刚实例化的DiveLog对象设置尺寸和背景, 而无须在其创建的时候进行设置。但是这两种方法都可行。
您无须重写DiveLog.java来继续教程,但是这样做可以作为练习 继承的好方法。
- 在文本编辑器中打开
DiveLog.java。
- 将类
public class DiveLog
改变为:
public class DiveLog extends JFrame
- 删除变量声明:
private JFrame dlframe;
- 将先前的
JFrame构造函数:
JFrame dlframe =
new JFrame("A Java(TM) Technology Dive Log");
改变为:
super("A Java(TM) Technology Dive Log");
- 从方法中删除
dlframe.。
- 在主类中初始化对象“
DiveLog”后,使用变量“dl” 来调用setSize(765, 690)、setBackground(Color.white) 以及setVisible(true)等方法。
例如:
- 保存文件。
- 编译
DiveLog.java 类:
在Windows平台上:
C:\divelog>javac -classpath C:\ DiveLog.java
在SolarisTM 操作环境中:
divelog% javac -classpath /home/usr/ DiveLog.java
注意:在运行命令时的环境必须是在目录“divelog”下。要 确认DiveLog.java.前的‘\’或‘/’ 之间有一个空格。 |
下一个潜水日志类“extends”可以扩展了一个类,从而获得继承 所带来的优势。类“Welcome”可以在潜水日志应用程序中负责管理 第一个标签的内容。
|