1、用任何一种计算机语言设计的程序在用任何一种计算机语言设计的程序在运行时都可能出现各种错误,常见的错误运行时都可能出现各种错误,常见的错误如除数为如除数为0、文件不存在、文件不能打开、文件不存在、文件不能打开、数组下标超过界限、内存不够用等。对于数组下标超过界限、内存不够用等。对于这种在运行中出现的错误,计算机系统中这种在运行中出现的错误,计算机系统中通常有两种处理办法。通常有两种处理办法。(1)由计算机系统本身直接检测程)由计算机系统本身直接检测程序错误,遇到错误时使程序终止运行。这序错误,遇到错误时使程序终止运行。这种处理方法的优点是使程序设计比较简单。种处理方法的优点是使程序设计比较简单。
2、但是,对程序错误一概地采用终止运行办但是,对程序错误一概地采用终止运行办法,显然过于简单化。因为有些情况下,法,显然过于简单化。因为有些情况下,完全可以通过其他途径保持程序继续运行。完全可以通过其他途径保持程序继续运行。比如,由于文件名不符合要求而无法打开比如,由于文件名不符合要求而无法打开文件,那么,可以提示用户输入一个新的文件,那么,可以提示用户输入一个新的文件名,从而使程序继续往下运行。文件名,从而使程序继续往下运行。(2)由程序员在程序设计中兼顾错)由程序员在程序设计中兼顾错误检测、错误信息显示和出错处理。这种误检测、错误信息显示和出错处理。这种处理方法的优点是减少了中途终止程序运处理
3、方法的优点是减少了中途终止程序运行的可能性。但是,要求程序员在程序设行的可能性。但是,要求程序员在程序设计中不仅将精力用于正常处理过程,还要计中不仅将精力用于正常处理过程,还要精心考虑错误检测和处理,这会使程序变精心考虑错误检测和处理,这会使程序变得复杂。并且,这类错误检测往往是多数得复杂。并且,这类错误检测往往是多数程序中重复甚至在一个程序中多次重复。程序中重复甚至在一个程序中多次重复。而另一方面,如果程序中某处忽略了应有而另一方面,如果程序中某处忽略了应有的检测,又将引起程序总体结果的错误。的检测,又将引起程序总体结果的错误。Java采用异常处理机制来处理程序运采用异常处理机制来处理程序运
4、行中的错误。按照这种机制,将程序运行行中的错误。按照这种机制,将程序运行中的所有错误都看成一种异常,通过对语中的所有错误都看成一种异常,通过对语句块的检测,一个程序中所有的异常被收句块的检测,一个程序中所有的异常被收集起来放在程序的某一段中去处理。在集起来放在程序的某一段中去处理。在Java系统中,专门设置了一个调用栈,此系统中,专门设置了一个调用栈,此栈中装有指向异常处理方法的指针。栈中装有指向异常处理方法的指针。在程序运行时,系统会把收集到的异在程序运行时,系统会把收集到的异常和异常处理指针所指的处理类型逐个比常和异常处理指针所指的处理类型逐个比较,如果找到相符的类型,那么就转向相较,如果
5、找到相符的类型,那么就转向相应的方法处理,如没有在调用栈中找到相应的方法处理,如没有在调用栈中找到相应的类型指针,则终止程序运行,并显示应的类型指针,则终止程序运行,并显示解释信息。解释信息。在在Java程序中,异常一般由以下两种程序中,异常一般由以下两种原因引起。原因引起。(1)程序中存在非法操作,最简单)程序中存在非法操作,最简单的例子就是除数为的例子就是除数为0的除法操作。这种原因的除法操作。这种原因常常是程序员出于无意或大意造成的,所常常是程序员出于无意或大意造成的,所以称为隐式异常。常见的隐式异常可以通以称为隐式异常。常见的隐式异常可以通过过java.lang包中的包中的Throwa
6、ble类的子类类的子类Error处理。处理。(2)程序员在程序中使用了)程序员在程序中使用了throw语语句引起的异常。这种异常是程序员出于某句引起的异常。这种异常是程序员出于某种考虑有意安排的,所以称为显式异常。种考虑有意安排的,所以称为显式异常。在在throw语句中,都会指出处理显式异常的语句中,都会指出处理显式异常的对象,这些对象都是由对象,这些对象都是由java.lang包的类包的类Throwable的子类的子类Exception再派生的子类再派生的子类生成的,每个对象完成对某种异常的处理生成的,每个对象完成对某种异常的处理功能,这些对象综合起来实现各种异常处功能,这些对象综合起来实现
7、各种异常处理。理。比如比如Array-IndexOutOfBoundsException子类处理数子类处理数组越界异常,组越界异常,IOException子类处理输入输子类处理输入输出异常,而出异常,而ArithmeticException子类处理子类处理除数为除数为0导致的算术异常等。导致的算术异常等。String类有多个构造方法,主要的有类有多个构造方法,主要的有下列下列5个:个:String();String(char chars);String(char chars,int startIndex,int numChars);String(byte ascii,int hiByte);S
8、tring(byte ascii,int hiByte,int startIndex,int numChars);第第1个构造方法生成一个空串。个构造方法生成一个空串。第第2个构造方法生成一个字符数组。个构造方法生成一个字符数组。第第3个构造方法生成一个字符串,这个构造方法生成一个字符串,这个字符串是从字符数组个字符串是从字符数组chars 中提取的,中提取的,具体讲,即从具体讲,即从chars 数组的数组的startIndex位位置开始提取字符,共提取置开始提取字符,共提取numChars个字符个字符组成一个字符串。组成一个字符串。第第4个构造方法是以字节数组的形式个构造方法是以字节数组的形
9、式生成一个字符串,数组中存放字符串各字生成一个字符串,数组中存放字符串各字符对应的符对应的ASCII码。码。第第5个构造方法也是从字节数组生成个构造方法也是从字节数组生成一个字符串。具体讲,就是以字节数组一个字符串。具体讲,就是以字节数组ascii 的的 startIndex处开始,共提取处开始,共提取numChars个字符构成字符串,如为个字符构成字符串,如为ASCII 字符,则字符,则hiByte的值为的值为0。例例4-5:import javax.swing.*;public class StringConstructors public static void main(String
10、args)char charArray=b,i,r,t,h,d,a,y;byte byteArray=(byte)n,(byte)e,(byte)w,(byte),(byte)y,(byte)e,(byte)a,(byte)r;StringBuffer buffer;String s,s1,s2,s3,s4,s5,s6,s7,output;s=new String(hello);buffer=new StringBuffer(Welcome to Java Programming!);s1=new String();s2=new String(s);s3=new String(charArra
11、y);s4=new String(charArray,6,3);s5=new String(byteArray,4,4);s6=new String(byteArray);s7=new String(buffer);output=s1=+s1+ns2=+s2+ns3=+s3+ns4=+s4+ns5=+s5+ns6=+s6+ns7=+s7;JOptionPane.showMessageDialog(null,output,Demonstrating String Class Constructors,JOptionPane.INFORMATION_MESSAGE);System.exit(0);
12、运行结果见图运行结果见图4-5。图 4-5图图4-5程序分析:程序分析:String类提供了类提供了9个构造函个构造函数,以便使用各种方法初始化数,以便使用各种方法初始化String对象。对象。例题共演示了例题共演示了7种。种。程序程序“s1=new String()”实例化一个实例化一个新的新的String对象,并使用对象,并使用String类的缺省构类的缺省构造函数将它赋给引用造函数将它赋给引用s1。新的新的String对象没对象没有字符(即空串),长度为有字符(即空串),长度为0。“s2=new String(s););”例化一个新的例化一个新的String对象,并使用对象,并使用Str
13、ing类的拷贝构造函类的拷贝构造函数,将它赋给引用数,将它赋给引用s2。s被当作参数传送给被当作参数传送给构造函数,新的构造函数,新的String对象包含了对象包含了String对对象象s中的字符的拷贝。中的字符的拷贝。在大多数情况下,没有必要拷贝已有在大多数情况下,没有必要拷贝已有的的String对象。对象。String对象是不变的,一旦对象是不变的,一旦创建后就不能改变它们的内容(字符串)。创建后就不能改变它们的内容(字符串)。而且,如果有一个或多个引用指向某而且,如果有一个或多个引用指向某个个String对象,垃圾收集器就不能回收该对象,垃圾收集器就不能回收该对象。也就是说,对象。也就是
14、说,String引用既不能用于引用既不能用于修改修改String对象,也不能删除对象,也不能删除String对象。对象。这一点与这一点与C语言或语言或C语言是不同的。语言是不同的。“s3=new String(charArray););”实实例化一个新的例化一个新的String对象,并使用以字符对象,并使用以字符数组为参数的数组为参数的String类构造函数,将它赋类构造函数,将它赋给引用给引用s3。新的新的String对象包含了数组中字对象包含了数组中字符的拷贝。符的拷贝。“s4=new String(charArray,6,3););”实例化一个实例化一个String对象,使用以一对象,使
15、用以一个字符数组和两个整数为参数的个字符数组和两个整数为参数的String类类构造函数,将它赋给引用构造函数,将它赋给引用s4。第第2个参数指个参数指定 了 在 数 组 中 拷 贝 字 符 的 起 始 位 置定 了 在 数 组 中 拷 贝 字 符 的 起 始 位 置(offset)。)。第第3个参数指定了数组中拷贝个参数指定了数组中拷贝字符的数目(字符的数目(count),),新的新的String对象包对象包含了数组中指定字符的拷贝。如果含了数组中指定字符的拷贝。如果offset或或count参数指定的所取元素超过了字符数组参数指定的所取元素超过了字符数组的界限,就会产生的界限,就会产生 St
16、ringIndexOutOfBoundsException 的例外的例外处理。处理。“s5=new String(byteArray,4,4););”实例化一个新的实例化一个新的String对象,使用对象,使用以一个以一个byte数组和两个整数为参数的数组和两个整数为参数的String类构造函数,将它赋给引用类构造函数,将它赋给引用s5。第第2和第和第3个参数分别指定了个参数分别指定了offset和和count。新的新的String对象包含了数组中指定对象包含了数组中指定 byte 的拷贝。的拷贝。如果如果offset或或count参数指定的所取元素超参数指定的所取元素超过了过了byte数组的
17、界限,就会产生一个数组的界限,就会产生一个StringIndexOutOfBoundsException的例外的例外处理。处理。“s6=new String(byteArray););”实实例化一个新的例化一个新的String对象,使用以一个对象,使用以一个byte数组为参数的数组为参数的 String类构造函数,将它赋类构造函数,将它赋给引用给引用s6。新的新的String对象包含了数组中对象包含了数组中byte的拷贝。的拷贝。“s7=new String(buffer););”实例实例化 一 个 新 的化 一 个 新 的 S t r i n g 对 象,使 用 以对 象,使 用 以Stri
18、ngBuffer为参数的为参数的String类构造函数,类构造函数,将它赋给引用将它赋给引用s7。StringBuffer是一个可动是一个可动态改变大小和内容的字符串。新的态改变大小和内容的字符串。新的String对象包含了对象包含了StringBuffer中字符的拷贝。中字符的拷贝。下面的例子演示了下面的例子演示了String 类的类的length、charAt和和getChars方法,它们分别用于确方法,它们分别用于确定定String 类的长度、取类的长度、取String某一指定位置某一指定位置的字符以及取的字符以及取String某一子串。某一子串。例例4-7:import javax.s
19、wing.JOptionPane;public class StringCompare public static void main(String args)String s1,s2,s3,s4,output;s1=new String(hello);s2=new String(good bye);s3=new String(Happy Birthday);s4=new String(happy birthday);output=s1=+s1+ns2=+s2+ns3=+s3+ns4=+s4+nn;if(s1.equals(hello)output+=s1 equals hellon;else
20、 output+=s1 does not equal hellon;if(s1=hello)output+=s1 equals hellon;else output+=s1 does not equal hellon;if(s3.equalsIgnoreCase(s4)output+=s3 equals s4n;else output+=s3 does not equal s4n;output+=pareTo(s2)is +pareTo(s2)+pareTo(s1)is +pareTo(s1)+pareTo(s1)is +pareTo(s1)+pareTo(s4)is +pareTo(s4)+
21、pareTo(s3)is +pareTo(s3)+nn;if(s3.regionMatches(0,s4,0,5)output+=First 5 characters of s3 and s4 matchn;else output+=First 5 characters of s3 and s4 do not matchn;if(s3.regionMatches(true,0,s4,0,5)output+=First 5 characters of s3 and s4 match;else output+=First 5 characters of s3 and s4 do not match
22、;JOptionPane.showMessageDialog(null,output,Demonstrating String Class Constructors,JOptionPane.INFORMATION_MESSAGE);System.exit(0);public String concat(String st)可返可返回一个字符串,它将把参数回一个字符串,它将把参数str添加在原字添加在原字符串的后面形成一个新的字符串。但在符串的后面形成一个新的字符串。但在Java中,更多的是使用中,更多的是使用“”来连接字符来连接字符串。串。这里读者可能会产生一个小小的迷惑,这里读者可能会产生一
23、个小小的迷惑,因为前面我们讲过因为前面我们讲过String对象是不能改变对象是不能改变的。实际上,字符串的连接是由编译器利的。实际上,字符串的连接是由编译器利用用StringBuffer的方法的方法append来实现的。这来实现的。这在下面的章节中讲解。在下面的章节中讲解。例例4-10:import javax.swing.*;public class StringConcat public static void main(String args)String s1=new String(Happy ),s2=new String(Birthday),output;output=s1=+s1
24、+ns2=+s2;output+=nnResult of s1.concat(s2)=+s1.concat(s2);output+=ns1 after concatenation=+s1;JOptionPane.showMessageDialog(null,output,Demonstrating String Method concat,JOptionPane.INFORMATION_MESSAGE);System.exit(0);运行结果见图运行结果见图4-10。图 4-10图图4-10String 类提供了很多处理字符串的功类提供了很多处理字符串的功能。但是,一旦创建了字符串对象,它的能
25、。但是,一旦创建了字符串对象,它的内 容 就 永 远 不 会 变。下 面 将 讨 论内 容 就 永 远 不 会 变。下 面 将 讨 论StringBuffer类的特点。这个类可以创建和类的特点。这个类可以创建和操纵动态字符串,即可修改的字符串。每操纵动态字符串,即可修改的字符串。每个个StringBuffer都能够存储由它的容量所指都能够存储由它的容量所指定的一些字符。如果超过了定的一些字符。如果超过了StringBuffer的的容量,容量就会自动地扩大以容纳多出来容量,容量就会自动地扩大以容纳多出来的字符。我们将看到,的字符。我们将看到,StringBuffer类还可类还可用来实现用于字符串
26、连接的运算符用来实现用于字符串连接的运算符。S t r i n g 对 象 是 常 量 字 符 串,对 象 是 常 量 字 符 串,StringBuffer 对象是可修改的字符串。对象是可修改的字符串。Java 区分字符串和可修改的字符串是为了区分字符串和可修改的字符串是为了优化的目的。特别地,优化的目的。特别地,Java可以实现有关可以实现有关String 对象的某些优化,例如多个引用共对象的某些优化,例如多个引用共享一个享一个String 对象,因为它知道这些对象对象,因为它知道这些对象不会改变。不会改变。注意:在选择是用注意:在选择是用String对象还是用对象还是用StringBuff
27、er对象来表示一个字符串时,如对象来表示一个字符串时,如果该对象确实不会改变,则总是使用果该对象确实不会改变,则总是使用String对象,这样做可以改善性能。对对象,这样做可以改善性能。对String对象调用非对象调用非 String 类的类的StringBuffer方法是一种语法错误。方法是一种语法错误。StringBuffer 提供提供的方法有一些与的方法有一些与 String 相同,有一些不同。相同,有一些不同。最主要的方法有两组,一组是最主要的方法有两组,一组是append,另另一组是一组是 insert。Java applet与与Java应用程序不同。它应用程序不同。它们的不同之处有
28、以下几个方面。们的不同之处有以下几个方面。(1)Java应用程序中,必须有一个应用程序中,必须有一个main()方法。方法。Main()方法是程序的入口,方法是程序的入口,当程序开始运行时,解释器首先查找当程序开始运行时,解释器首先查找main()方法并执行。而方法并执行。而Java applet中则不需要中则不需要main()方法,它必须嵌入方法,它必须嵌入HTML文件中,文件中,由支持由支持Java applet的浏览器运行。的浏览器运行。(2)Java应用程序可以独立运行。而应用程序可以独立运行。而Java applet不能独立运行,需要依赖于网不能独立运行,需要依赖于网络浏览器。络浏览
29、器。(3)Java应用程序所实现的功能是完应用程序所实现的功能是完全的,不需依赖于其他程序。而全的,不需依赖于其他程序。而Java applet实现的功能是不完全的,它必须借实现的功能是不完全的,它必须借助于浏览器中预先设计好的功能和已有的助于浏览器中预先设计好的功能和已有的图形界面。图形界面。Java applet只需接收浏览器发只需接收浏览器发送给它的消息,并及时做出响应。送给它的消息,并及时做出响应。(4)Java应用程序中的所有方法的应用程序中的所有方法的使用是通过调用实现的。可以人为控制。使用是通过调用实现的。可以人为控制。而而Java applet中有一部分方法是固定的,中有一部分
30、方法是固定的,只能由浏览器在特定时刻和场合调用,不只能由浏览器在特定时刻和场合调用,不能人为控制,但可以重载。能人为控制,但可以重载。Java applet的一般程序结构如下:的一般程序结构如下:import java.applet.*;import java.awt.*;public class 子类名子类名 extends Applet /定义定义Applet类的子类类的子类 public void init()方法体方法体 /初始化方法初始化方法 public void start()方法体方法体 /开始执行方法开始执行方法 public void stop()方法体方法体 /停止执行方
31、法停止执行方法 public void destroy()方法体方法体 /退出方法退出方法 public void paint(Graphics g)方法体方法体 /绘画方法绘画方法从从Java applet程序结构看出,程序结构看出,Java applet由若干类组成,无需由若干类组成,无需main()方法,但方法,但必须有且仅有一个主类,该类是必须有且仅有一个主类,该类是Applet类类的子类,且被声明为的子类,且被声明为public。程序被保存程序被保存时,程序名必须命名为主类名,即程序名时,程序名必须命名为主类名,即程序名与主类名完全相同,后缀为与主类名完全相同,后缀为.java。主类
32、中主类中定义了定义了init()、start()、stop()、destroy()和和paint()方法,这些方法是从方法,这些方法是从Applet中继承中继承的,有固定的含义,由浏览器在时机成熟的,有固定的含义,由浏览器在时机成熟时自动执行。时自动执行。在浏览器中运行在浏览器中运行Applet程序,从运行程序,从运行开始到运行结束,开始到运行结束,Applet程序需经历程序需经历4个状个状态,分别是初始状态、运行状态、停止态态,分别是初始状态、运行状态、停止态和消亡状态。这和消亡状态。这4种状态分别对应种状态分别对应Applet的的4个主要方法:个主要方法:init()、start()、st
33、op()和和destroy()。对于支持对于支持Java的浏览器,如果在运行的浏览器,如果在运行一个一个HTML文件时发现该文件包含文件时发现该文件包含Applet程序,浏览器就会生成该程序,浏览器就会生成该Applet的一个实的一个实例,并调用例,并调用init()方法,进入初始化状态,方法,进入初始化状态,在该状态下完成在该状态下完成Applet的一些初始化操作。的一些初始化操作。初始化完成后,浏览器接着调用初始化完成后,浏览器接着调用start()方方法,进入运行状态,真正开始执行法,进入运行状态,真正开始执行Applet,在该状态下在该状态下Applet通常会启动一些线程执通常会启动一
34、些线程执行各种任务。行各种任务。当退出当前主页时,浏览器调用当退出当前主页时,浏览器调用stop()方法终止在运行状态下启动的线程,进入方法终止在运行状态下启动的线程,进入停止状态。当用户退出浏览器时,浏览器停止状态。当用户退出浏览器时,浏览器首先调用首先调用Applet的的stop()方法,停止方法,停止Applet的执行,然后调用的执行,然后调用destroy()方法释放方法释放Applet占用的系统资源,进入消亡状态。占用的系统资源,进入消亡状态。下面具体介绍下面具体介绍init()、start()、stop()和和destroy()4种方法。种方法。在在Applet执行过程中,执行过程
35、中,init()方法只执方法只执行一次。当浏览器第一次浏览含有行一次。当浏览器第一次浏览含有Applet的的Web页载入页载入Applet时,就会执行时,就会执行init()方方法。法。由于在由于在Applet执行过程中,该方法只执行过程中,该方法只被执行一次,所以可以在被执行一次,所以可以在init()方法中进行方法中进行一些只需执行一次的初始化操作,如变量一些只需执行一次的初始化操作,如变量的初始化、设置的初始化、设置Applet初始状态、载入图初始状态、载入图形或字体、获取形或字体、获取HTML中中Applet标记单元标记单元中中设定的参数等。设定的参数等。调用完调用完init()方法,
36、浏览器将调用方法,浏览器将调用start()方法启动方法启动Applet。和和init()方法不同,在方法不同,在Applet的执行过程中,的执行过程中,start()方法可被浏览方法可被浏览器调用多次。在下列情况下,浏览器会调器调用多次。在下列情况下,浏览器会调用用start()方法。方法。(1)浏览器从图标状态恢复为窗口)浏览器从图标状态恢复为窗口状态或缩放浏览器窗口时。状态或缩放浏览器窗口时。(2)Applet第一次载入时。第一次载入时。(3)离开该)离开该Web页后又再返回时。页后又再返回时。(4)reload该页面时。该页面时。在在start()方法中可启动相关线程来控方法中可启动相
37、关线程来控制制Applet,给引入类对象发送消息,或以给引入类对象发送消息,或以某种方式通知某种方式通知Applet开始运行。该方法是开始运行。该方法是Applet的主体。的主体。该方法与该方法与start()方法是相对应的,在方法是相对应的,在Applet执行过程中,也会被浏览器调用多执行过程中,也会被浏览器调用多次。在下列情况下,浏览器会调用次。在下列情况下,浏览器会调用stop()方方法。法。(1)浏览器从图标状态恢复为窗口)浏览器从图标状态恢复为窗口状态或缩放浏览器窗口时。状态或缩放浏览器窗口时。(2)离开)离开Applet所在所在Web页时。页时。(3)reload该页面时。该页面时
38、。(4)关闭该)关闭该Web页时。页时。(5)从该)从该Web页退出浏览器运行时。页退出浏览器运行时。stop()方法可在适当时机挂起方法可在适当时机挂起 Applet,停止一些占用系统资源的工作,释放系统停止一些占用系统资源的工作,释放系统处理资源,以提高系统的运行速度。处理资源,以提高系统的运行速度。在彻底结束对该在彻底结束对该Web页的访问或退出页的访问或退出浏览器时调用浏览器时调用destroy()方法,卸载方法,卸载Applet,释放载入释放载入Applet时分配的系统资源。在时分配的系统资源。在Applet的执行过程中,的执行过程中,destroy()方法只执方法只执行一次。行一次
39、。destroy()方法是方法是Applet类的类方法,类的类方法,只能用于只能用于Applet。可在该方法中执行释放可在该方法中执行释放系统资源的代码。但一般不需重写系统资源的代码。但一般不需重写destroy()方法,因为方法,因为Java运行系统本身会自动进行运行系统本身会自动进行“垃圾垃圾”处理和内存管理,除非用了特殊处理和内存管理,除非用了特殊的资源如创建的线程。的资源如创建的线程。注意:注意:destroy()方法与方法与stop()方法不同。方法不同。除了上述除了上述4个方法外,个方法外,Applet还提供一还提供一个非常重要的方法:个非常重要的方法:paint(Graphics
40、 g)方法。该方法用于进行绘图的具体操作,方法。该方法用于进行绘图的具体操作,但没有实现任何操作,用户可重写该方法,但没有实现任何操作,用户可重写该方法,实现个性化的绘图操作。实现个性化的绘图操作。在在Applet执行过程中,执行过程中,paint()方法可方法可以被浏览器自动调用执行绘图操作,可调以被浏览器自动调用执行绘图操作,可调用多次。当调整浏览窗口大小、缩放浏览用多次。当调整浏览窗口大小、缩放浏览窗口、移动窗口或窗口、移动窗口或reload等需要重绘窗口等需要重绘窗口时都会调用时都会调用paint()方法。方法。与其他与其他4个方法不同的是,个方法不同的是,paint()中需中需传递一
41、个参数,该参数是传递一个参数,该参数是Graphics类的对类的对象,由这个对象来完成具体的绘图操作。象,由这个对象来完成具体的绘图操作。Graphics对象由浏览器自动创建并将其传对象由浏览器自动创建并将其传送给送给paint()方法。方法。注意:应在注意:应在Applet中引入中引入Graphics类类的包或该类:的包或该类:import java.awt.Graphics;例例4-16:import java.applet.*;import java.awt.*;public class example4_16 extends Applet private int InitCount;p
42、rivate int StartCount;private int StopCount;private int DestroyCount;private int PaintCount;public example4_16()InitCount=0;StartCount=0;StopCount=0;DestroyCount=0;PaintCount=0;public void init()InitCount+;public void destroy()DestroyCount+;public void start()StartCount+;public void stop()StopCount+
43、;public void paint(Graphics g)PaintCount+;g.drawString(Paint()方法执行了方法执行了:+PaintCount+次。次。,20,20);g.drawString(Init()方法执行了方法执行了:+InitCount+次。次。,20,70);g.drawString(Start()方法执行了方法执行了:+StartCount+次。次。,20,120);g.drawString(Stop()方法执行了方法执行了:+StopCount+次。次。,20,170);g.drawString(Destroy()方法执行方法执行了了:+DestroyCount+次。次。,20,220);Java applet程序不能独立运行,必须程序不能独立运行,必须由浏览器来运行,因此我们需编写一个由浏览器来运行,因此我们需编写一个HTML文件,通过文件,通过标记将标记将applet程程序编译生成的字节码文件嵌入序编译生成的字节码文件嵌入HTML文件,文件,通知浏览器来运行通知浏览器来运行Java applet。如要运行例如要运行例4-16,可编写如下的,可编写如下的HTML文件:文件:example4_16