??xml version="1.0" encoding="utf-8" standalone="yes"?> JAVAE序员必读:基础(2Q面向对象编E概?/p> 如果你以前从来没有用面向对象语aQ你需要在开始编写JAVA代码之前先理解这个概c你需要理解什么是对象、什么是cR对象和cȝ关系怎样以及使用消息怎样在对象之间进行通讯。本教程的前面部分将描述面向对象~程的概念,而后面的教程教你怎样这个概늼成代码?/p> 对象是一些相关的变量和方法的软g集。Y件对象经常用于模仿现实世界中我们w边的一些对象。对象是理解面向对象技术的关键。你在学习之前可以看看现实生zM的对象,比如狗、桌子、电视、自行R{等。你可以发现现实世界中的对象有两个共同特征:它们都有状态和行ؓ。比如狗有自q状态(比如名字、颜艌Ӏ生育以及饥饿等{)和行为(比如摇尾巴等{)。同栯行R也有自己的状态(比如当前档位、两个轮子等{)和行为(比如刹R、加速、减速以及改变档位等{)?/p> 而Y件对象实际上是现实世界对象的造型Q因为它同样有状态和行ؓ。一个Y件对象利用一个或者多个变量来l持它的状态。变量是qh识符来命名的数据VY件对象用它的Ҏ来执行它的行为。方法是跟对象有兌的函敎ͼ子程序)?/p> 你可以利用Y件对象来代表现实世界中的对象。你可能想用一个动ȝ序来代表现实世界中的狗,或者用可以控制电子自行车的E序来代表现实世界的自行车。同样你可以使用软g对象来造型抽象的概念,比如Q事件是一个用在GUIH口pȝ的公共对象,它可以代表用h下鼠标按钮或者键盘上的按键的反应?/p> 如图1是一个Y件对象的公共可视代表?/p> Q图1Q?/p> 软g对象的状态和行ؓ都可以用在对象中的变量和Ҏ来表达。构造现实世界的自行车的软g对象要有指示自行车的当前状态的变量Q速度?0mphQ它的当前档位ؓW三档。这些变量就是我们熟知的实例变量Q因为它们包含了用于Ҏ自行车对象的状态,q且在面向对象技术中Q特D的对象UCؓ实例?/p> 如图2所C,是作Y件对象的自行车造型?/p> Q图2Q?/p> 除了变量QY件自行R同样有用于刹车、改变踏板步调以及改变档位的Ҏ。这些方法就是熟知的实例Ҏ因ؓ它们查或者改变特D自行R实例的状态?/p> 以上的对象图昄了对象的变量l成了圆心部分。方法处在变量的四周q且在程序中从其它对象隐藏了对象的核心。用保护Ҏ的方法来包装对象的变量称为封装。这个对象图是对象理想的表C法Q也是面向对象系l设计者努力的最后目标。然而这q不是全部的内容。通常Q出于某U现实的理由Q对象可能暴露它的一些变量或者隐藏一些方法。在JAVA~程语言中,一个对象可以ؓ变量和方法指定四U访问等U中的一U。这个访问等U决定哪个对象和cd以访问变量或者方法。在JAVA中访问变量和Ҏ可以转换为控制访问类的成员函数。封装相关的变量和方法到一个简z的软g集是一个简单而且强有力的ҎQ它Y件开发者提供了两个主要好处Q?/p> 模块性:对象的源代码可以独立于其它的对象源代码来q行~写和维护。同P对象可以很容易地在系l中传递。你可以你的自行R对象l其它的对象Q它仍然可以正常工作?/p> 信息隐藏Q?/strong>一个对象如果有一个公q界面Q那么其它的对象可以与之进行通讯。这个对象可以维护私人的信息和方法,它可以在M时候被改变而不影响依耐于它的其它对象。所以你不必理解自行车中齿轮的机理就可以使用它?/p> 软g对象之间q行交互作用和通讯是利用消息的?/p> 单一的一个对象通常不是很有用的。相反,一个对象通常是一个包含了许多其它对象的更大的E序或者应用程序。通过q些对象的交互作用,E序员可以获得高阶的功能以及更ؓ复杂的行为。你的自行R如果不用它的时候,它就是一堆铝合金和橡Ӟ它没有Q何的zd。而只有当有其它的对象来和它交互的时候才是有用的?/p> 软g对象与其它对象进行交互与通讯是利用发送给其它对象来实现的。当对象A惛_象B来执行一个B中的ҎQ对象A׃消息l对象B。如?所C?/p> Q图3Q?/p> 有时候,接收的对象需要更多的信息p于它可以正确知道该如何做。比如,当你x变自行R的轮,你就必须指出哪个齿轮。这个信息是信息作为参数来传递的。如?所C的现实了一个信息由三个lgl成Q?/p> Q图4Q?/p> 上面的三个组件对于接收方的对象执行相应的Ҏ是给Z充分的信息。再也不需要其它的信息或者上下文了?/p> 消息提供了两个重要的好处Q?/p> cd际上是对某种cd的对象定义变量和Ҏ的原型?/p> 在现实世界中Q你l常看到相同cd的许多对象。比? Q你的自行R只是现实世界中许多自行R的其中一辆。用面向对象技术,我们可以说你的自行R是自行R对象cȝ一个实例。通常Q自行R有一些状态(当前档位、两个轮子等{)以及行ؓQ改变档位、刹车等{)。但是,每辆自行车的状态都是独立的q且跟其它自行R不同?/p> 当厂家制造自行R的时候,厂商利用了自行R共有的特性来Ҏ相同的蓝囑ֈ造许多自行R。如果制造一辆自行Rp产生一个新蓝图Q那效率太低了?/p> 在面向对象Y件中Q同样地Q可以让相同U类地许多对象来共有一些特性,比如矩Ş、雇员记录、视频夹{等。就象自行R刉商人,你可以利用相同种cȝ对象是相似的事实q且你可以ؓq些对象创徏一个蓝图。对对象的Y件蓝囑֏做类?/p> 自行车的c需要定义一些实例变量来包括当前档位、当前速度{等。这个类ؓ实例Ҏ定义和提供实施方法,它允讔R车者改变档位、刹车以及改变脚t板的节奏,如图5所C: Q图5Q?/p> 当你创徏了自行RcM后,你可以从q个cdZQ意个自行车对象。当你创Z一个类的实例后Q系l将个对象和的实例变量分配内存。每个实例将l所有实例变量的副本定义在类中。如?所C: Q图6Q?/p> 除了实例变量Q类q要定义cȝ变量。类变量包含了被cL有实例共享的信息。比如,假设所有的自行车有相同的档位数。在本例子中Q要定义一个实例变量来容纳档位数。每一个实例都会有变量的副本,但是在每一个实例中数值都是相同的。在q样的情况下Q你可以定义一个类变量来包含档位数Q这h有的cȝ实例都共享这个变量。如果一个对象改变了变量Q它׃ؓ改变那个cȝ所有对象。类同样可以定义cL法。你可以直接从类中调用类ҎQ然而你必须在特定的实例中调用实例方法。如?所C?/p> Q图7Q?br /> 下面详细讨论一下实例和cL员,具体涉及变量和方法以及类变量和方法: 你这样声明一个成员变量,比如在类Myclass中有一个float型的aFloat: class MyClass { float aFloat; } q样你就声明一个实例变量。每ơ你创徏一个类的实例的时候,pȝ׃ؓ实例创徏了类的每一个实例变量的副本。你可以从对象中讉K对象的实例变量?/p> 实例变量跟类变量是不一LQ类变量CZ用静态修攚w来声明的。不类创徏了多个实例Q系lؓ每个cd量分配了cd量。系lؓcd量分配的内存是在它第一ơ调用类的时候发生的。所有的实例׃n了类的类变量的相同副本。你可以通过实例或者通过cLw来讉Kcd量?/p> 它们的方法是cM的:你的cd以有实例Ҏ和类Ҏ。实例方法是对当前对象的实例变量q行操作的,而且讉Kcd量。另外一个方法,cL法不能访问定义在cM的实例变量,除非它们创徏一个新的对象ƈ通过对象来访问它们。同PcL法可以在cM被调用,你不必需要一个实例来调用一个类Ҏ?/p> ~省圎ͼ除非其它的成员被指定Q一个定义在cM成员是一个实例成员。这个在下面定义的类有一个实例变量,有一个整型的xQ两个实例方法x和setXQ它们设|其它对象以及查询x的数倹{?/p> class AnIntegerNamedX { int x; public int x() { return x; } public void setX(int newX) { x = newX; } } 每次你从一个类实例化一个新的对象,你可以得到每个类的实例变量的副本。这些副本都是跟新对象有关系的。因此,每次你从q个cd例化一个新的AnIntegerNamedX对象的时候,你得以得到跟新的AnIntegerNamedX对象有关的新副本? 一个类的所有实例共享一个实例方法的相同的实行;所有的AnIntegerNamedX实例都共享x和setX的相同执行。这里注意,两个Ҏx和setX是指对象的实例变量x。但是,你可能会问:如果所有AnIntergerNamedX׃nx和setX的相同执行,会不会造成模棱两可的状态?{案当然是:不是。在实例Ҏ中,实例变量的名字是指当前对象的实例变量Q假如实例变量不是由一个方法参数来隐藏的。这样在x和setX中,xq价于q个xQ而不会造成混ؕ?br />对于AnIntegerNamedX外部的对象如果想讉KxQ它必须通过特定的AnIntegerNamedX的实例来实现。假如这个代码片D处在其它对象的Ҏ中。它创徏了两U不同类型的AnIntegerNamedXQ它讄了xZ同的数|然后昄它们Q?/p> AnIntegerNamedX myX = new AnIntegerNamedX(); AnIntegerNamedX anotherX = new AnIntegerNamedX(); myX.setX(1); anotherX.x = 2; System.out.println("myX.x = " + myX.x()); System.out.println("anotherX.x = " + anotherX.x()); q里注意Q代码用setX来ؓmyX讄x的|而直接给anotherX.x指定一个数倹{不用什么方法,代码是在操作两个不同的x副本Q一个包含在myX对象中一Q另外一个包含在anotherX对象中。其输出是用以下代码片段来实现的Q? myX.x = 1 anotherX.x = 2 上面代码昄了类AnIntegerNamedX的每一个实例有自己实例变量x的副本以及每个x有自q数倹{?/p> 你可以在声明成员变量的时候,指定变量是一个类变量而不是一个实例变量。相似地Q你可以指定Ҏ是一个类Ҏ而不是一个实例方法。系l在W一ơ调用类来定义变量的时候创Z一个类变量的副本。所有的cd例共享了cd量的相同副本。类Ҏ可以只操作类变量Q它们不能访问定义在cM的实例变量?/p> Z指定一个成员变量ؓ一个类变量Q你可以使用static关键字。比如,我们可以修改一下上面的AnIntegerNamedXc,使得x变量现在是一个类变量Q?/p> class AnIntegerNamedX { static int x; public int x() { return x; } public void setX(int newX) { x = newX; } } 现在讄它们的x数值ƈ昄不同的输出: myX.x = 2 anotherX.x = 2 q次的输Z同,是因为x现在是一个类变量Q所以就只有q个变量的副本,它是被AnIntegerNamedX的所有实例所׃n的,包括myX和anotherX。当你在其它实例中调用setX的时候,你可以ؓ所有的AnIntegerNamedX的所有实例改变x的数倹{?/p> 同样Q当我们声明一个方法的时候,你可以指定方法ؓcL法而不是实例方法。类Ҏ只可以在cd量中q行操作Qƈ且不能访问定义在cM的所有实例变量?/p> Z指定Ҏ为类ҎQ你可以在方法声明处使用static关键字。下面,我们再次来修改AnIntegerNamedXc,使它的成员变量xZ个实例变量,以及它的两个Ҏ为类ҎQ?/p> class AnIntegerNamedX { int x; static public int x() { return x; } static public void setX(int newX) { x = newX; } } 当你想编译这个版本的AnIntegerNamedXQ编译器׃昄如下的错误: AnIntegerNamedX.java:4: Can't make a static reference to nonstatic variable x in class AnIntegerNamedX. return x; ^ 出现q些错误的原因是cL法不能访问实例变量,除非Ҏ先创建AnIntegerNamedX的一个实例ƈ且通过它来讉K变量?br />下面我们修改一下AnIntegerNamedXQ让x变量成ؓcd量: class AnIntegerNamedX { static int x; static public int x() { return x; } static public void setX(int newX) { x = newX; } } 现在为x讄数|q打印出x数| myX.x = 2 anotherX.x = 2 再一ơ,我们通过myX来改变xQƈ它改变为AnIntegerNamedX的其它实例?/p> 实例成员和类成员之间的另外一个差别是cL员可以从cLw进行访问。你不必实例化类来访问它的类成员。下面让我们~写一D代码来直接从AnIntegerNamedXcM讉Kx和setXQ?/p> . . . AnIntegerNamedX.setX(1); System.out.println("AnIntegerNamedX.x = " + AnIntegerNamedX.x()); . . . 值得一提的是,你现在已l不用再创徏myX和anotherX了。你可以讄xq直接AnIntegerNamedXcM索x。你不能利用实例成员来处理它Q你只能从一个对象来调用实例Ҏq且只可以从对象中访问实例变量。而你可以从类的实例或者从cLw来讉Kcd量和Ҏ? 下面讲讲初始化实例和cL员: 你可以在cM定义它们的时候,使用static初始化程序和实例初始化程序来为类和实例成员提供初始化数| class BedAndBreakfast { static final int MAX_CAPACITY = 10; boolean full = false; } q个对于原始数据cd是没有问题的。有时候,它可以用在创建数l和对象。但是这个初始化表单有它的限Ӟ如下Q?/p> 如果你有一些初始化要完成,可能有些不能在初始化E序实现Q因为出C上面的限制之一Q这时你不得不将初始化代码随意放|了。ؓ了初始化cL员,在static初始化块中放|初始化代码。ؓ了初始化实例成员Q就要在构造函C攄初始化代码了?br />2.4.3 Static初始化块 下面再讲讲Static初始化块 下面举一个例子,如图8所C: Q图8Q?/p> errorStrings源代码必dstatic初始化块中被初始化。这是因为错误恢复必d源代码没有被扑ֈ得时候才被执行。同ӞerrorStrings是一个类成员Q它不能在构造函C被初始化。在前面得例子中一Q一个static初始化块是以static关键字开头得Qƈ且JAVA代码是用大括?#8220;{}”括v来的?/p> 一 个类可以有许多static初始化块Q它可以出现在类中Q何地斏V系l保证static输出化块以及static初始化程序是按它们在源代码中的顺序被调用的?br /> 如果你想初始化一个实例变量而且不能在变量声明处来处理它Q那么就只能在构造函C来ؓq个cd始化了。假如errorStrings是一个实例变量而不是一个类变量Q你可以用以下的代码来初始化它: import java.util.ResourceBundle; class Errors { ResourceBundle errorStrings; Errors() { try { errorStrings = ResourceBundle. getBundle("ErrorStrings"); } catch (java.util.MissingResourceException e) { // error recovery code here } } } 现在代码是在构造函C为类来初始化q个errorStrings的?/p> 有时Q类包含了许多构造函数ƈ且每个构造函数允许调用者ؓ新对象的不同实例变量提供初始化数倹{比如,java.awt.Rectangle有以下的三个构造函敎ͼ Rectangle(); Rectangle(int width, int height); Rectangle(int x, int y, int width, int height); Rectangle()构造函数没有Q何的参数Q所以它不能让用户大或者原点和大小提供初始化数|而其它的两个构造函敎ͼ它可以让用户讄初始数倹{?/p> 然而,所有的实例变量Q原点和大小Q都必须初始化。在q个例子中,cȝ常有一个构造函数来完成所有的初始化。其它的构造函数调用这个构造函数ƈ且提供给它参数或者缺省数倹{比如下面是以上所说的三个构造函敎ͼ它们初始化如下: Rectangle() { this(0,0,0,0); } Rectangle(int width, int height) { this(0,0,width,height); } Rectangle(int x, int y, int width, int height) { this.x = x; this.y = y; this.width = width; this.height = height; } JAVA语言支持实例初始化块Q你可以攑ֿ使用它。这里徏议用构造函数来初始化,主要有以下三个原因: 你可能会注意到对象和cȝh很相伹{在现实世界中,cd对象之间的区别经常是让程序员困惑的源泉。在现实世界中,很明显,cM能是它们描述的对象本w。然而,在Y件中很困难来区分cd对象。有部分原因是Y件对象只是现实世界中的电子模型或者是抽象概念。但是也因ؓ对象通常有时是指cd实例?/p> 一个类可以从它的父cȝ承状态和行ؓ。承ؓl织和构造Y件程序提供了一个强大的和自然的机理?/p> d说来Q对象是以类得Ş式来定义得。你可能现在已经可以从它cȝ道许多对象了。即使你如知道,如果我告诉你它是一辆自行RQ你׃知道它有两个轮子和脚t板{等。面向对象系l就更深入一些了Q它允许cd其它cM定义。比如,山地自行车、赛车以及串座双行R都是各种各样的自行R。在面向对象技术中Q山地自行R、赛车以及串座双行R都是自行车类的子cR同样地Q自行RcL山地自行车、赛车以及串座双行R的父cR这个父子关pd以如?所C: Q图9Q?/p> 每一个子例从父类中承了状态。山地自行R、赛车以及串座双行R׃n了这些状态:速度{。同P每一个子cȝ承类从父cȝҎQ山地自行R、赛车以及串座双行R׃n了这些行为:刹R、改变脚t速度{等?br />然而,子类不能受到父类提供的状态和行ؓ的限制。子cd以增加变量和ҎC父类l承而来的变量和Ҏ。比如,串双h自行车有两个座位Q这是它的父cL有的? 子类同样可以重蝲l承的方法ƈ且ؓq些Ҏ提供Ҏ执行Ҏ。比?Q如果你有一个山地自行R有额? 的轮设|,你就可以重蝲改变齿轮Ҏ来骑R者可以用这些新的轮? 你也不能受限于承的一个层ơ。承树或者类的分U结构可以是很深。方法和变量是逐l承的。ȝ来说Q在分l构的越下方Q就有越多的行ؓ?/p> 如果对象cd于分U结构的端Q那么每个类都是它的后代Q直接地或者是间接圎ͼ。一U类型的对象保留M对象的一个引用,比如cL者数l的一个实例。对象提供了行ؓQ这些行为是q行在JAVA虚拟机所需要的。比如,所有类l承了对象的toStringҎQ它q回了代表对象的字符丌Ӏ?/p> 下面说说我们Z么要使用l承Q它到底有哪些好处呢Q好处是有的Q?/p> 接口是一个收集方法和常数表单的契U。当cL行一个接口,它就许诺声明在那个接口中执行所有的Ҏ?/p> 接口是一个设备或者一个系l,它是用于交互的无关的实体。根据这个定义,q程控制是一个在你和电视的接口;而英语是两个Z间的接口Q强制在军事中的行ؓ协议是不同等价h之间的接口。在JAVA语言中,接口是一个设备,它是用来与其它对象交互的讑֤。一个接口可能对一个协议是cM的。实际上Q其它面向对象语a有接口的功能Q但它们调用它们的接口协议?/p> 自行车类和它的类分l构定义了什么是自行车。但是自行R在其它方面与现实世界交互作用Q例如,仓库中的自行车可以由一个存货程序来理。一个存货程序不兛_理目的哪一cd要项目提供某一信息Q比如h格和跟踪数字。取代强q类与其它无关项的关p,存货E序建立了通讯的协议。这个协议是由包含在接口中的常数和方法定义组成的。这个存货清单接口将要定义(但不执行Q方法来讄和得到零售h|指定跟踪数字{等?/p> Z在存货清单程序中操作Q自行Rcdd执行接口的时候遵守这个协议。当一个了执行一个接口的时候,c遵守定义在接口中的所有方法。因此,自行车将些设|和获得零售hq指定跟t数值等{的Ҏ提供执行?/p> 你可以用接口来定义一个行为的协议Q这个行为可以有在类分l构中Q何类来执行。接口的主要好处有一下几点: q一节给你展现创建对象、执行类、发送消息、创Z个父cM及执行一个接口的代码?/p> 以下是一个applet(applet是用JAVA~程语言~写的程序,它可以运行在兼容JAVAq_的网l浏览器Q比如HotJava或者Netscape Navigator)的程序,名ؓClickMe。如?0所C,当你点击Ҏ内Q何地方,一个红点就会出现?/p> Q图10Q?/p> 提示Q上面的applet需要JDK1.1。如果你使用老的不支持JDK1.1的浏览器Q你不能运行这个applet。相反,你需要在一?.1览器上来看q个|页Q比如在HotJava、JDK Applect览?appletviewer)或者某个版本的Netscape Navigator和Internet Explorer?/p> 下面具体解释一下这个Applet?/p> ClickMe Applet是一个相对简单的E序因此它的代码q了多了。但是,如果你还没有太多的编E经验,你可以发现这些代码也不是那么Ҏ的。我们不要求你马上理解程序中的每个问题,q且q节教程也不是讲了十分详l的。这里的目的C暴露一些源代码l你q且跟你刚才所学道的概念和技术联pM。你在以后的教E中学到更详l的内容?br />2.7.1ClickMe的源代码和Applet标签 Z~译q个applet你需要两个源文gQClickMe.java和Spot.java。ؓ了运行这个applet你需要利用这个applet标签来创Z个html文gQ?/p> 然后装蝲|页到浏览器或者appletviewer工具。ƈ且确保所有必要的文g都在相同的目录中?如图11所C: Q图11Q?br /> 在这个applet中有许多对象。两个最明显的是Qapplet本n和红炏V?/p> 览器在包含applet的HTML代码中碰到applet标签的时候就创徏了applet对象。这个applet标签从创建applet对象的地Ҏ供类的名字。在本例子中Q这个类的名字ؓClickMe?/p> ClickME.applet创Z个对象来在屏q上d炏V每ơ你在applet中点击鼠标的时候,applet将通过改变对象的x和y坐标来移动红炏V这个点不是自己d来的Q它是appletd的,它是Ҏ包含在点对象中的信息d的?/p> 除了前面两个明显的对象,另外q有一些看不见的对象呢。有代表三种颜色Q黑、白、红Q的三个对象以及代表点击鼠标的用户动作的事g对象{等?br /> 2.7.3ClickMe Applet中的c?/strong> 因ؓ代表在屏q上点的对象是很单,接下来让我们看看q个名ؓspot的类吧。它声明了三个实例变量:包括点半径的sizeQ包含点当前水^位置的x坐标以及包含点当前垂直位|的y坐标Q?/p> public class Spot { //实例变量 public int size; public int x, y; //构造函?/p> public Spot(int intSize) { size = intSize; x = -1; y = -1; } } 另外Q类有一个构造函敎ͼ它用来初始化q创徏的新对象。构造函数跟cL相同的名字。这个构造函数初始化所有三个对象的变量。Size的初始化数值是在调用的时候位参数提供的。x和y变量都被讄?1Q这?1的目的是Z让点在开始的时候处于屏q的外面Q即产生假不可视的效果?/p> q个applet是在applet初始化的时候创Z一个新的点对象。下面是appletcȝ相关代码Q? private Spot spot = null; private static final int RADIUS = 7; ... spot = new Spot(RADIUS); W一行声明了一个名为spot的变量,它是Spot数据cdQƈ且初始化q个变量为NULL。第二行声明了一个整型变量,名ؓRADIUSQ它的gؓ7。最后一行是创徏一个对象。New关键字ؓ对象分配了内存空间。Spot(RADIUS)调用了上面已l描qC的构造函数ƈ且传递RADIUS数|q样点对象的sizep讄?。如?2所C的左图代表了Spotc,而右边的是代表了spot对象?/p> Q图12Q?/p> 如所知道的,对象A可以使用消息来请求对象B做一些事情,一个消息有三个l成部分Q? 在ClickMe appletU有以下两行q样的代码: g.setColor(Color.white); g.fillRect(0, 0, getSize().width - 1, getSize().height - 1); q两个消息都是从applet到名为g的对象。其中g是一个图形对象,它知道怎样在屏q上单画一些Ş状或者文本。这个对象在览器指Capplet来画的时候提供了applet。上面代码的W一行设|颜色ؓ白色Q第二行是填充一个指定大的矩Ş区域Q它的颜色ؓ白色。如?3所C,是一个消息的三个l成部分Q?/p> Q图13Q?br /> Z在浏览器U运行,对象必须是一个applet。这意味着对象必须是类的一个实例,q个cL从由JAVAq_提供的AppletcL生而来的?/p> ClickMe applet对象是一个ClickMecȝ一个实例,它是q样声明的: public class ClickMe extends Applet implements MouseListener { ... } 上面的语句就产生了Applet的一个子cRClickMel承了父cȝ许多功能Q包括初始化、由览器来开始和l束、在览器区域画图以及对接收到的鼠标事g注册。除了有了这些功能,ClickMec还要实C下的功能Q它的画图代码在paint的方法中Q初始化代码必须在initҎ中等{? public void init() { ... // q里加入ClickMe的初始化代码 } public void paint(Graphics g) { ... // q里加入ClickMe的画图代?/p> } ClickMe applet是通过在鼠标点d昄一个红Ҏ响应鼠标的点M件。如果对象想通知鼠标点击QJAVAq_事gpȝ需要对象执行MouseListener接口。这个对象必d时作为鼠标监听器来注册?/p> q个MouseListener接口声明了五U不同的志芋工,每种Ҏ是用在鼠标被点击的时候对不同鼠标事g的调用。当鼠标被点ȝ时候,或者当鼠标Ud到applet外面的时候等{? 下面是ClickMe applet完整的代码。其中mousePressed是处理鼠标事件的Q?/p> 本节教程试一下你对对象、类、消息等{的理解Q我们是通过做一些练习以及回{一些问题来q行的?/p> 你可以用API文档来回{这些问题: 现在Q利用你从API文档中学到的知识来修改ClickMe applet。ؓ了编译这个程序,你同样需要Spot.java文g。具体修改如下:
]]>
~译QZSC/太^z网l学?/td> Q责~?爆破手]
2.4.2初始化实例和cL?/strong>
]]>
~译QZSC/太^z网l学?责编:Purple
JAVA是有SUN公司开发的C代编E语aQ它可以用在各种不同的机器、操作系l的|络环境中进行开发。不Z使用哪种览器或者用哪U操作系l(Windows、Unix{等Q,只要览器支持JAVAQ你可以看到生动的主页。JAVA正在逐步成ؓInternet应用的主要开发语aQ它d改变了应用Y件的开发模式,速发展的信息世界增添了新的活力。所以作为Internet应用的开发技术h员不可不看JAVAQ而JAVAE序不可不先从基学vQ这正是JAVAE序员必读:基础的用意?/p>
本JAVA教程讨论JAVA~程语言的基知识。其中内Ҏ及以下几个方面:
1.面向对象~程概念
教会你面向对象~程的核心概念,比如对象、消息、类和承等{。本节教E最后将l出实例这些概늼E代码实现。如果你寚w向对象编E很熟悉了,你可以蟩q本节日教程Q直接进入第二节教程?/p>
2.语言基础
本节教程讲述了传l的语言Ҏ,其中包括变量、数据类型、运符以及控制程{等?/p>
3.对象和简单数据对?/u>
本节教程介l常规的创徏和用Q何类型对象的原则。然后,本教E还描述了怎样使用数组、字W串以及数字对象Q它们都通常被用于对象类型。最后,q将介绍怎样出格式化数据?/p>
4.cdl承
描述了怎样~写从已l创Z的对象来~写cR?/p>
5.接口和包
界面和包是JAVA~程语言的特性,它帮助你l织和构造类以及跟其它类的关pR?/p>
6.~程中的一些共同的问题
解释了在学习JAVA语言q程中可以出现的问题的解x法?/p>