站内搜索: 请输入搜索关键词

当前页面: 开发资料首页Java 专题JAVA程序员必读:基础篇6

JAVA程序员必读:基础篇6

摘要: JAVA程序员必读:基础篇6
 
2.5什么是继承
  一个类可以从它的父类继承状态和行为。继承为组织和构造软件程序提供了一个强大的和自然的机理。
  总得说来,对象是以类得形式来定义得。你可能现在已经可以从它类知道许多对象了。即使你如知道,如果我告诉你它是一辆自行车,你就会知道它有两个轮子和脚踏板等等。面向对象系统就更深入一些了,它允许类在其它类中定义。比如,山地自行车、赛车以及串座双人自行车都是各种各样的自行车。在面向对象技术中,山地自行车、赛车以及串座双人自行车都是自行车类的子类。同样地,自行车类是山地自行车、赛车以及串座双人自行车的父类。这个父子关系可以如图9所示:
(图9)
  每一个子例从父类中继承了状态。山地自行车、赛车以及串座双人自行车共享了这些状态:速度等。同样,每一个子类继承类从父类的方法,山地自行车、赛车以及串座双人自行车共享了这些行为:刹车、改变脚踏速度等等。
2.5什么是继承
  然而,子类不能受到父类提供的状态和行为的限制。子类可以增加变量和方法到从父类继承而来的变量和方法。比如,串座双人自行车有两个座位,这是它的父类没有的。
  子类同样可以重载继承的方法并且为这些方法提供特殊执行方法。比如 ,如果你有一个山地自行车有额外 的齿轮设置,你就可以重载改变齿轮方法来使骑车者可以使用这些新的齿轮。
  你也不能受限于继承的一个层次。继承树或者类的分级结构可以是很深。方法和变量是逐级继承的。总的来说,在分级结构的越下方,就有越多的行为。
  如果对象类处于分级结构的顶端,那么每个类都是它的后代(直接地或者是间接地)。一种类型的对象保留任何对象的一个引用,比如类或者数组的一个实例。对象提供了行为,这些行为是运行在JAVA虚拟机所需要的。比如,所有类继承了对象的toString方法,它返回了代表对象的字符串。
下面说说我们为什么要使用继承,它到底有哪些好处呢?好处是有的:
子类提供了特殊的行为,这是在父类中所没有的。通过使用继承,程序员可以多次重新使用在父类中的代码。
程序员可以执行父类(称为抽象类)来定义总的行为。这个抽象的父类可以定义并且部分执行行为,但是绝大多数的父类是未定义和未执行的。其它的部分由程序员来实现特殊的子类。 2.6什么是接口
  接口是一个收集方法和常数表单的契约。当类执行一个接口,它就许诺声明在那个接口中执行所有的方法。
  接口是一个设备或者一个系统,它是用于交互的无关的实体。根据这个定义,远程控制是一个在你和电视的接口;而英语是两个人之间的接口;强制在军事中的行为协议是不同等价人之间的接口。在JAVA语言中,接口是一个设备,它是用来与其它对象交互的设备。一个接口可能对一个协议是类似的。实际上,其它面向对象语言有接口的功能,但它们调用它们的接口协议。
  自行车类和它的类分级结构定义了什么是自行车。但是自行车在其它方面与现实世界交互作用,例如,仓库中的自行车可以由一个存货程序来管理。一个存货程序不关心管理项目的哪一类只要项目提供某一信息,比如价格和跟踪数字。取代强迫类与其它无关项的关系,存货程序建立了通讯的协议。这个协议是由包含在接口中的常数和方法定义组成的。这个存货清单接口将要定义(但不执行)方法来设置和得到零售价格,指定跟踪数字等等。
  为了在存货清单程序中操作,自行车类必须在执行接口的时候遵守这个协议。当一个了执行一个接口的时候,类遵守定义在接口中的所有方法。因此,自行车将为这些设置和获得零售价格并指定跟踪数值等等的方法提供执行。
你可以使用接口来定义一个行为的协议,这个行为可以有在类分级结构中任何类来执行。接口的主要好处有一下几点:
不用人工强迫类关系在无关类中截获相似处。
声明想执行的一个或者更多类的方法。
在不暴露对象的类的前提下,暴露对象的编程接口。 2.7怎样将这些面向对象的概念转换为代码
  这一小节将给你展现创建对象、执行类、发送消息、创建一个父类以及执行一个接口的代码。
  以下是一个applet(applet是用JAVA编程语言编写的程序,它可以运行在兼容JAVA平台的网络浏览器,比如HotJava或者Netscape Navigator)的程序,名为ClickMe。如图10所示,当你点击方框内任何地方,一个红点就会出现。
(图10)
提示:上面的applet需要JDK1.1。如果你使用老的不支持JDK1.1的浏览器,你将不能运行这个applet。相反,你需要在一个1.1浏览器上来看这个网页,比如在HotJava、JDK Applect浏览器(appletviewer)或者某个版本的Netscape Navigator和Internet Explorer。
下面具体解释一下这个Applet。
ClickMe Applet是一个相对简单的程序因此它的代码就短了多了。但是,如果你还没有太多的编程经验,你可以发现这些代码也不是那么容易的。我们不要求你马上理解程序中的每个问题,并且这节教程也不是讲了十分详细的。这里的目的示暴露一些源代码给你并且跟你刚才所学道的概念和技术联系上。你将在以后的教程中学到更详细的内容。
2.7怎样将这些面向对象的概念转换为代码
2.7.1ClickMe的源代码和Applet标签
为了编译这个applet你需要两个源文件:ClickMe.java和Spot.java。为了运行这个applet你需要利用这个applet标签来创建一个html文件:
width="300" height="150">

其中ClickMe.java的源代码为:
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
public class ClickMe extends Applet implements MouseListener {
private Spot spot = null;
private static final int RADIUS = 7;
public void init() {
addMouseListener(this); }
public void paint(Graphics g) {
//画一个黑边框和白背景
g.setColor(Color.white);
g.fillRect(0, 0, getSize().width - 1, getSize().height - 1);
g.setColor(Color.black);
g.drawRect(0, 0, getSize().width - 1, getSize().height - 1);
//画红点
g.setColor(Color.red);
if (spot != null) {
g.fillOval(spot.x - RADIUS, spot.y - RADIUS, RADIUS * 2, RADIUS * 2); } }
public void mousePressed(MouseEvent event) {
if (spot == null) {
spot = new Spot(RADIUS);
}
spot.x = event.getX();
spot.y = event.getY();
repaint(); }
public void mouseClicked(MouseEvent event) {}
public void mouseReleased(MouseEvent event) {}
public void mouseEntered(MouseEvent event) {}
public void mouseExited(MouseEvent event) {} }
而Spot.java的源代码为:
public class Spot {
public int size;
public int x, y;
public Spot(int intSize) {
size = intSize;
x = -1;
y = -1; } }
然后装载网页到浏览器或者appletviewer工具。并且确保所有必要的文件都在相同的目录中。 如图11所示:
(图11) 2.7.2 ClickMe Applet中的对象
在这个applet中有许多对象。两个最明显的是:applet本身和红点。
浏览器在包含applet的HTML代码中碰到applet标签的时候就创建了applet对象。这个applet标签从创建applet对象的地方提供类的名字。在本例子中,这个类的名字为ClickMe。
ClickME.applet将创建一个对象来在屏幕上画出点。每次你在applet中点击鼠标的时候,applet就将通过改变对象的x和y坐标来移动红点。这个点不是自己画出来的,它是applet画出的,它是根据包含在点对象中的信息画出的。
除了前面两个明显的对象,另外还有一些看不见的对象呢。有代表三种颜色(黑、白、红)的三个对象以及代表点击鼠标的用户动作的事件对象等等。 2.7.3ClickMe Applet中的类
因为代表在屏幕上点的对象是很简单,接下来让我们看看这个名为spot的类吧。它声明了三个实例变量:包括点半径的size,包含点当前水平位置的x坐标以及包含点当前垂直位置的y坐标:
public class Spot {
//实例变量
public int size;
public int x, y;
//构造函数
public Spot(int intSize) {
size = intSize;
x = -1;
y = -1; } }
另外,类有一个构造函数,它用来初始化由类创建的新对象。构造函数跟类有相同的名字。这个构造函数初始化所有三个对象的变量。Size的初始化数值是在调用的时候座位参数提供的。x和y变量都被设置为-1,这里-1的目的是为了让点在开始的时候处于屏幕的外面,即产生假不可视的效果。
这个applet是在applet初始化的时候创建了一个新的点对象。下面是applet类的相关代码:
private Spot spot = null;
private static final int RADIUS = 7; ...
spot = new Spot(RADIUS);
第一行声明了一个名为spot的变量,它是Spot数据类型,并且初始化这个变量为NULL。第二行声明了一个整型变量,名为RADIUS,它的值为7。最后一行是创建一个对象。New关键字为对象分配了内存空间。Spot(RADIUS)调用了上面已经描述了的构造函数并且传递RADIUS数值,这样点对象的size就被设置为7。如图12所示的左图代表了Spot类,而右边的是代表了spot对象。
(图12) 2.7.4ClickMe Applet中的消息
就如所知道的,对象A可以使用消息来请求对象B做一些事情,一个消息有三个组成部分:
消息被寻址的对象
要执行执行方法的名字
方法需要的任何参数
在ClickMe applet种有以下两行这样的代码:
g.setColor(Color.white);
g.fillRect(0, 0, getSize().width - 1, getSize().height - 1);
这两个消息都是从applet到名为g的对象。其中g是一个图形对象,它知道怎样在屏幕上简单画一些形状或者文本。这个对象在浏览器指示applet来画的时候提供了applet。上面代码的第一行设置颜色为白色,第二行是填充一个指定大小的矩形区域,它的颜色为白色。如图13所示,是一个消息的三个组成部分:
(图13) 2.7.5 ClickMe Applet中的继承
为了在浏览器种运行,对象必须是一个applet。这就意味着对象必须是类的一个实例,这个类是从由JAVA平台提供的Applet类派生而来的。
ClickMe applet对象是一个ClickMe类的一个实例,它是这样声明的:
public class ClickMe extends Applet implements MouseListener { ... }
上面的语句就产生了Applet的一个子类。ClickMe继承了父类的许多功能,包括初始化、由浏览器来开始和结束、在浏览器区域画图以及对接收到的鼠标事件注册。除了有了这些功能,ClickMe类还要实现以下的功能:它的画图代码在paint的方法中,初始化代码必须在init方法中等等。
public void init() {
... // 这里加入ClickMe的初始化代码 }
public void paint(Graphics g) {
... // 这里加入ClickMe的画图代码 }
2.7.6 ClickMe Applet中的接口
ClickMe applet是通过在鼠标点击出显示一个红点来响应鼠标的点击事件。如果对象想通知鼠标点击,JAVA平台事件系统需要对象执行MouseListener接口。这个对象必须同时作为鼠标监听器来注册。
这个MouseListener接口声明了五种不同的志芋工,每种方法是用在鼠标被点击的时候对不同鼠标事件的调用。当鼠标被点击的时候,或者当鼠标移动到applet外面的时候等等。
下面是ClickMe applet完整的代码。其中mousePressed是处理鼠标事件的:
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
public class ClickMe extends Applet implements MouseListener {
private Spot spot = null;
private static final int RADIUS = 7;
public void init() {
addMouseListener(this); }
public void paint(Graphics g) {
// 画一个黑色边框和一个白色背景
g.setColor(Color.white);
g.fillRect(0, 0, getSize().width - 1, getSize().height - 1);
g.setColor(Color.black);
g.drawRect(0, 0, getSize().width - 1, getSize().height - 1);
//画一个点
g.setColor(Color.red);
if (spot != null) {
g.fillOval(spot.x - RADIUS,
spot.y - RADIUS,
RADIUS * 2, RADIUS * 2); } }
public void mousePressed(MouseEvent event) {
if (spot == null) {
spot = new Spot(RADIUS); }
spot.x = event.getX();
spot.y = event.getY();
repaint(); }
public void mouseClicked(MouseEvent event) {}
public void mouseReleased(MouseEvent event) {}
public void mouseEntered(MouseEvent event) {}
public void mouseExited(MouseEvent event) {} }
↑返回目录
前一篇: JAVA程序员必读:基础篇7
后一篇: JAVA程序员必读:基础篇5