【北京大学计算机系】Java讲义-完整版_第1页
【北京大学计算机系】Java讲义-完整版_第2页
【北京大学计算机系】Java讲义-完整版_第3页
【北京大学计算机系】Java讲义-完整版_第4页
【北京大学计算机系】Java讲义-完整版_第5页
已阅读5页,还剩570页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1Java讲义北京大学计算机系2第一章Java的类北京大学计算机系代亚非3第一章Java的类1.1有关面向对象的概念1.2Java语言的特点1.3Java的开发环境1.4第一个Java程序1.5Java类型系统1.6Java中字符串的类1.7Java中的类、方法和变量1.8Java名空间及访问规则1.9Java中的抽象类、接口和程序包1.10对象的构造函数41.1有关面向对象的概念面向对象程序设计围绕的几个主要概念:抽象数据类型、类、类型层次(子类),继承性、多态性。51.1有关面向对象的概念classCar{intcolor_number;intdoor_number;

intspeed;

voidbrake(){…}voidspeedUp(){…};voidslowDown(){…}}

计算机中的对象的原型

现实生活中的对象

数据抽象类型61.1有关面向对象的概念什么是类?类是描述对象的“基本原型”,它定义一种对象所能拥有的数据和能完成的操作,在面向对象的程序设计中,类是程序的基本单元。variablesmethods

程序中的对象是类的一个实例,是一个软件单元,它由一组结构化的数据和在其上的一组操作构成。71.1有关面向对象的概念变量:即指对象的所知道的状态方法:指对象的功能单元。什么是消息?软件对象通过相互间传递消息来相互作用和通信一个消息由三部分组成:1.接受消息的对象2.要完成方法的名字3.方法需要的参数对象B对象Amessage81.1有关面向对象的概念一个例子在程序中操作对象是类的一个实例:即对象创建一个对象Helloobj=newHello();调用方法obj.showString(“HelloWorld!”)classHello{

}privateStrings;publicvoidshowString()

{System.out.println(s);}publicvoidchangeString(Stringstr){s=str;returns;}91.1有关面向对象的概念什么是封装?封装把对象的所有组成部分组合在一起,封装定义程序如何引用对象的数据,封装实际私有数据

方法上使用方法将类的数据隐藏起来,控制用户对类的修改和访问数据的程度。

方法数据对象A对象B公有数据101.1有关面向对象的概念什么是子类?子类是作为另一个类的扩充或修正所定义的一个类.bicycle(superclass)MountainbikesRacingbikesTandembikessubclass111.1有关面向对象的概念什么是继承?继承是子类利用父类中定义的方法和变量就像它们属于子类本身一样.classCar{intcolor_number;intdoor_number;intspeed;

push_break(){…}add_oil(){…}}

classTrash_Car

extendsCar{doubleamount;fill_trash(){…}}121.1有关面向对象的概念什么是方法的覆盖?在子类中重新定义父类中已有的方法。classCar{intcolor_number;intdoor_number;intspeed;

push_break(){speed=0;}add_oil(){…}}

classTrash_Car

extendsCar{doubleamount;fill_trash(){…}

push_break(){speed=speed-10;}}131.1有关面向对象的概念什么是方法的重载(多态性)?在同一个类中至少有两个方法用同一个名字,但有不同的参数。类voidshow(intint_num)voidshow(doubledouble_num)voidshow(nitnit_um,floatfloat_um)123141.2Java语言的特点Java是什么?

Java=“C++”--“复杂性和奇异性”+“安全性和可移植性”Java由那些特性?(1)面向对象封装性、多态性、继承性、动态链接(2)操作平台无关性严格的语言定义:“没有依据机器的不同而不同”或“由编译器决定”等字眼,最后的目标码都是一致的,初值都是确定的151.2Java语言的特点两种工作模式的比较源程序Java编译器SPARCpentiumPowerpc中间码PowerpcpentiumSPARC二进制源程序SPARCPowerpcpentiumPowerpcpentiumSPARC编译器二进制Java解释器161.2Java语言的特点.编译,没有绝对地址调入包含,继承所用道的所有类,内存分配确定,编程真正可执行的机器码Java源程序(.java文件)Java编译器JavaBytecode(.class文件)系统执行平台Bytecode解释器Bytecode载入器字节码校验器不存在伪造的指针不违反访问权限不非法访问对象不导致操作栈溢出

171.2Java语言的特点Java虚拟机JavainterpreterJust-in-timecompilerRuntimeSystemOperatingSystemHardware不同的操作系统有不同的虚拟机.它类似一个小巧而高效的CPU.byte-code代码是与平台无关的是虚拟机的机器指令.Java字节代码运行的两种方式:interpreter(解释方式)Just-in-time(即时编译):有代码生成器将字节代码转换成本机的机器代码,然后可以以较高速度执行.

181.2Java语言的特点(3)安全问题Java是在网络环境下使用的语言一个安全的网络至少要防止以下几种破坏的可能性:毁灭系统资源消耗系统资源挖掘系统或个人机密骚扰正常工作的进行191.2Java语言的特点Java源程序(.java文件)Java编译器JavaBytecode(.class文件)Bytecode载入器Bytecode解释器系统执行平台语言定义publicprotectedprivatefinal取消指针自动回收垃圾Bytecode检查限定对象的存取权限系统堆栈溢出参数类型一致程序执行系统WWW浏览器限制Java小应用程序的不正当使用201.2Java语言的特点(4)多线程Java提供现成的类Thread,只要继承这个类就可以编写多线程的程序。(5)Java与C及C++的区别不再有#include和#define等于处理功能不再有structure,union及typedef不再有函数、不再有指针、不再有多重继承不再有goto不再有操作符重载(OperatiorOverloading)取消自动类型转换,要求强制转换211.3Java的开发环境Java开发环境JDKJDK中有Java编译器和bytecode解释器Applwtviewer是小应用程序的bytecode解释器JDK的安装直接执行221.3Java的开发环境产生如下目录结构java\bin的目录下包含义下主要文件:javac:Java编译器,用来将java程序编译成

Bytecodejava:Java编译器,执行已经转换成Bytecode的

java应用程序.jdb:Java调试器,用来调试java程序javap:反编译,将类文件还原回方法和变量.javadoc:文档生成器,创建HTML文件appletviwer:Java解释器,用来解释已经转换成

Bytecode的java小应用程序.231.3Java的开发环境\java\lib子目录库函数,其中不要解开.在中加入以下两条命令1.PATHc:\…\java\bin2.SETCLASSPATH=.;c:\...\lib\classes.zip;c:\myclasses;241.3Java的开发环境C:\javabinlibclasses.zipjavacjavaappletviewer用户类文件所在目录myclasses当前目录251.3Java的开发环境vj1.1++的使用1.进入vj,创建一个project2.加入java文件3.编辑java文件4.编译java文件5.Build一个project文件6.运行java程序

--如果是小应用程序,则直接在VJ环境下运行

--如果是应用程序,则在dos下运行261.4你的第一个Java程序编辑存盘:主类名(含有main方法)和文件名要一致性编译程序运行程序:javaHelloWorldApp“myjava”运行结果:Hi,myjavaclassHelloWorldApp{publicstaticvoidmain(Stringargs[]){System.out.println(“Hi,”+args[0]);}}Java应用和Java小应用程序271.4你的第一个Java程序1.声明一个类:publicclassHelloWorldApp{},类名的第一个字母要大写2.一个类中可有很多方法,main方法是运行程序的第一个方法,方法名的第一个字母要小写.是向屏幕输出,相当于C中的printf();publicclassHelloWorldApp{publicstaticvoidmain(Stringargs[]){System.out.println(“Hi,”+args[0]);}}281.4你的第一个Java程序4.命令行参数的获取

c:>javaHelloWorldAppmyjava!6.字符串的拼接publicclassHelloWorldApp{publicstaticvoidmain(Stringargs[]){System.out.println(“Hi,”+args[0]);}}291.4你的第一个Java程序Java小应用程序不能直接执行和使用,必须要在浏览器中执行importjava.applet.Applet;importjava.awt.*;publicclassHelloAppletextendsApplet{publicvoidpaint(Graphicsg){g.drawString(“HelloWorld”,0,50);}}编辑存盘:主类名(extendsApplet)和文件名一致编译代码编写HTML文件301.4你的第一个Java程序运行applet程序:2.在浏览器中运行运行结果:HelloWorld!<html><body><appletcode=“HellApplet.class”width=200height=100></applet></body></html>311.4你的第一个Java程序理解程序1.import语句相当于C语言中的include每2.每一个applet都是的子类用extends继承3.applet中没有main方法importjava.applet.Applet;importjava.awt.*;publicclassHelloAppletextendsApplet{publicvoidpaint(Graphicsg){g.drawString(“HelloWorld”,0,50);}}321.4你的第一个Java程序4.当applet被浏览器运行时,paint语句自动执行5.在applet中与屏幕输出有关的操作通过Graphics对象来实现6.一个Java源文件内最多只能有一个public类,称为主类,且必须和文件名同名importjava.applet.Applet;importjava.awt.*;publicclassHelloAppletextendsApplet{publicvoidpaint(Graphicsg){g.drawString(“HelloWorld”,0,50);}}331.5Java类型系统Javatypesystemprimitivereferencenullcharnumericbooleanclassinterfacearrayintegralfloating-pointbyteshortintlongfloatdouble341.5Java类型系统byte8位2的补码(byte)0short16位2的补码(short)0int32位2的补码0long64位2的补码0Lfloat32位IEEE754浮点数标准double64位IEEE754浮点数标准char16位同一码字符集‘\u0000’(Unicodecharacter)351.5Java类型系统程序:保留字,标识符(类名、域名、方法名、符号常量、局部变量,标号、…),操作符、界定符,字面常量。声明一个变量intdata=10;BooleanisAlived;Java中的操作符:与C基本一致Java中不再有指针了361.5Java类型系统在Java中”引用“是指向一个对象在内存中的位置,在本质上是一种带有很强的完整性和安全性的限制的指针.当你声明某个类,接口或数组类型的一个变量时,那个变量的值总是某个对象的引用或者是null引用.指针就是简单的地址而已,引用除了表示地址而外,还象被引用的数据对象的缩影,还提供其他信息.指针可以有++,--运算,引用不可以运算.371.5Java类型系统s1s210001s2=s1;astring10001classMydate{intyear;intmonth;intday;}

Mydatetoday=newMyDate()00010008todays1=“astring”;例:Strings1;Strings2;381.5Java类型系统能够动态取得的内存有两种,一种是对象实体,一种数组.Java用new申请内存,不需要自己释放不用的内存.在Java中,定义数组时不必给出数组的大小,因为Java的数组是动态分配的。数组变量实际上是一个引用变量,因此要实例化才能使用。例:intArray[];Array=newint[8];391.5Java类型系统例:StringarrayOfString[]=newString[10];每个数组元素包含一个对字符串对象的引用,此时值分配了包含字符串引用的空间,并没有对字符串本身分配内存,此时不能访问。arrayOfStringfor(inti=0;i<arrayString.length;i++)arrayOfString[i]=newString(“Hello”+i)arrayOfString[0]arrayOfString[1]arrayOfString[8]arrayOfString[9]对数组的引用对字符串的引用401.6Java中的字符串Java中的字符串类String和StringBufferString类的定义和实例的生成例:Stringstr;str=“thisisastring”或:Stringstr1=newString(“hello”);或:Stringstr2=“aaaa”;String类与其它类型的转换例1:将实型数转换成字符串System.out.println(String.valueOf(Math.PI));.411.6Java中的字符串有两个字符串str1,str2str1=str2;是指两个引用指向同一个地址str1.equals(str2)是指两个字符串内容相等获取String对象的信息例如:Strings=“thisisastring”;intlen=s.length();booleanresult=s.equal(“thisisa特test”);charch=s.charAt(6);421.6Java中的字符串StringBuffer的字符串的内容是可以改变的创建StringBuffer对象StringBufferstr=newStringbuffer(“hello”);获取StringBuffer对象的信息intlen=str.length();例:StringBuffersb=newStringBuffer(“DrinkJava!”);sb.insert(6,”Hot”);System.out.println(sb.toString());

DrinkHotJava!System.out.println接受的是String类431.7Java中的类、方法和变量试用一个简单的类classCar{intcar_number;

voidset_number(intcar_num){car_number=car_num;}

voidshow_number(){System.out.println(“MycarNo.is:”+car_number);}}classCarDemo{publicstaticvoidmain(Stringargs[]){CarDemocar=newCar();DemoCar.set_number(3838);DemoCar.show_number();}}Mycarnumberis3838441.7Java中的类、方法和变量类的继承关系classCar{intcar_number;voidset_number(intcar_num){car_number=car_num;}

voidshow_number(){System.out.println(“MycarNo.is:”+car_number);}}classTrashCarextendsCar{intcapacity;voidset_capacity(inttrash_car_capacity){capacity=trash_car_capacity;}

voidshow_capacity();{System.out.println(“Mycapacityis:”+capacity);}}451.7Java中的类、方法和变量TrashCar中继承了Car中的两个方法classCarDemo{publicstaticvoidmain(Stringargs[]){TrashCarDemoTrashCar=newTrashCar();DemoTrashCar.set_number(4949);DemoTrashCar.set_capacity(20);DemoTrashCar.show_number();DemoTrashCar.show_capacity();}}

Car是父类,TrashCar是子类461.7Java中的类、方法和变量何时选择继承性?一个很好的经验:“B是一个A吗?”如果是则让B做A的子类.常犯的错误A有一个B吗?例如让汽车轮子成为汽车的子类是错误的471.7Java中的类、方法和变量类的严格定义及修饰字[类的修饰字]class类名称[extends父类名称]{….}public,abstract,final或者没有[变量修饰字]变量数据类型变量名1,变量名2[=变量初值]…;[方法修饰字]方法的返回值类型方法名称(参数1,参数2,…{…//方法的内容}方法和变量的定义及修饰字public、protected、private481.8Java名空间及访问规则每个类都创造了有自己的名字空间,指方法和变量可以知道彼此的存在,可以使用。abstract类不能直接产生属于这个类的对象final类不能被其他任何类所继承(安全的考虑)public类不但可以被同一程序包中的其它类使用,别的程序包中的类也可以使用.friendly(缺省)类只能被本包中的其它类使用491.8Java名空间及访问规则变量和方法的修饰字public、protected、privatepublic:任何其它类、对象只要可以看到这个类的话,那么它就可以存取变量的数据,或使用方法。classABC{publicintpub_i=5;

publicvoidshow)()(“pub_i”+pub_i);}501.8Java名空间及访问规则classDemo{publicstaticvoidmain(Stringargs[]){ABCabc=newABC();System.out.println(“abc.pub_i”+abc.pub_i);abc.pub_i=10;abc.show();}}abc.pub_i=5pub_i=10;511.8Java名空间及访问规则protected变量和方法如果一个类中变量或方法有修饰字protected,同一类,同一包可以使用。不同包的类要使用,必须是该类的子类可以存取变量或调用publicclassABC{protectedintpro_i=5;

protectedvoidshow()(“pro_i=”+pro_i;)}}

521.8Java名空间及访问规则不同中的类不能使用classDEF{publicstaticvoidmain(Stringargs[]){ABCabc=newABC();(“_i=“+_i);abc.pub_i=10;abc.show();}}53importmytest.pack.ABC;classDEFextendsABC{publicstaticvoidmain(Stringagrs[]){DEFdef=newDEF();System.out.println(def.i);def.i=10;def.show();}}pro_i=5pro_i=101.8Java名空间及访问规则不同包但是是子类541.8Java名空间及访问规则private不允许任何其他类存取和调用friendly(前边没有修饰字的情况)在同一程序包中出现的类才可以直接使用它的数据和方法.551.8Java名空间及访问规则当子类中的变量名与父类的相同,原来的变量被遮盖.classA{intdata_a=3;}classBextendsA{intdata_a=5;}classCextendsB{voidprint_out(){System.out.println(“data_a=”+data_a);System.out.println(“A.data_a=”+A.data_a);System.out.println(“B.data_a=”+B.data_a);}}data_a=5A.data_a=3B.data_a=5classdemo{publicstaticvoidmain(Stringargs[]){Cc=newC();c.println_out();}}561.8Java名空间及访问规则方法的覆盖(overriding)和重载(overloading)子孙类中定义的方法和祖先类中某个方法同名,同参数行,则祖先类中的该方法被覆盖.方法的重载是指一个对象的多态性,即多个方法用相同的名称,但参数行不同.类voidshow(intint_num)voidshow(doubledouble_num)voidshow(nitnit_um,floatfloat_um)123571.8Java名空间及访问规则到此为止finalfinal在方法之前,防止该方法被覆盖.final在类之前,标是该类不能被继承final在变量之前,定义一个常量.属于类的变量和方法staticstatic在变量或方法之前,

表明它们是属于类的,classABCD{chardata;staticint_share_data;}classDemo{ABCDa,b,c,d}objectbchardataobjectcchardataObjectbchardatastaticintshare_dataobjectbchardata581.8Java名空间及访问规则静态变量在各实例间共享如果是public静态变量,则其它类可以不通过实例化访问它们静态方法称为类的方法,因此不用实例化即可调用(面向过程)一个对象的方法可以访问对象的数据成员,尽管不属于方法的局部变量一个类的方法只能访问自己的局部变量591.8Java名空间及访问规则例:不正确的引用classStaticError{Stringmystring=“hello”;publicstaticvoidmain(Stringargs[]){System.out.println(mystring);}}错误信息:can’tmakeastaticreferencetononstaticvariable.为什么不正确?只有对象的方法可以访问对象的变量.601.8Java名空间及访问规则解决的办法:1.将变量改称类变量classStaticError{staticStringmystring=“hello”;publicstaticvoidmain(Stringargs[]){System.out.println(mystring);}}611.8Java名空间及访问规则2.先创建一个类的实例classNoStaticError{publicstaticvoidmain(Stringargs[]){Stringmystring=“hello”;System.out.println(mystring);}}}621.9Java中的抽象类、接口和程序包抽象类是指不能直接被实例化的类,因此一般作为其它类的超类,与final类正好相反抽象类中的抽象的方法-在该类中定义但不在该类中提供实现,由继承类提供细节publicabstractclassSomeAbstractClass{voidmethod1(){System.out.println(“Hi,Java”);}voidmethod2();}定义抽象方法的类必须是抽象类.631.9Java中的抽象类、接口和程序包//已有两个类Circle和Rectangle,完成相关参数的计算classCircle{publicintr;Circle(intr){this.r=r}//this指"这个对象的"publicintarea(){return3*r*r;}//取近似}classRectange{publicintwidth,height;//这里不需"this"Rectangle(intw,inth){width=w,height=h;}publicintarea(){returnwidth*height;}}641.9Java中的抽象类、接口和程序包假设有若干个Circle,以及若干个Rectangle,希望计算它们的总面积,直截了当的做法是将它们分别放到两个数组中,用两个循环,加上一个加法,这种做法是不漂亮的如果还有其它形状,triangle,ellipses等,上述方法显得“累赘”,我们希望有一种统一的表示,例如用一个数组shape[],接受所有的形状,然后用for(i=0;i<shape.length;i++){area_total+=shape[i].area();651.9Java中的抽象、接口和程序包abstractclassShape{abstractfloatarea();}classCircleextendsShape{publicintr;Circle(intr){this.r=r;}publicfloatarea(){return3.14*r*r;}}classSquareextendsShape{publicintwidth,height;Rectangle(intw,inth){width=w,height=h;}publicfloatarea(){returnwidth*height;}}661.9Java中的抽象类、接口和程序包利用接口可实现多重继承(可同时实现多个接口)接口的作用和抽象类类似,指定原型,不直接定义方法的内容.关键字implement用来实现方法,即在使用时要用给出方法的实际内容接口中的方法和变量是public的interfaceStack{voidpush(objectx);objectpop();}classAextendsAppletimplementsStack{voidpush(objectx){…;//具体内容

}objectpop(){…;//具体内容}}

671.9Java中的抽象类、接口和程序包程序包:相当于其它语言中的库函数打包packageGraphics;classSquare{…;}classCircle{…;}classTriangle{…;}使用程序包中的类要用import命令.表示路径,*表示使用包中的所有类;importjava.io.*;iojavaFileInputStream681.10对象的构造函数使用new来做内存配置classDemo1//数组的配置{publicstaticvoidmain(Stringargs[]){intarray[][];

array=newint[5][5];array[1][4]=5;}}

classmyClass//对象实体的产生{intdata=5;}classDemo2{publicstaticvoidmain(Stringargs[]){myClassobj;//建立一个引用

obj=newmyClass();System.out.println(obj.data);}}691.10对象的构造函数Constructor和finalizerconstructor(构造函数),在一个类中和类同名的方法叫构造函数.系统在产生对象时会自动执行.classPoint{intx,y;Point(){x=0;y=0;}Point(intnew_x,intnew_y){x=new_x,y=new_y;}}

classUsePoint{Pointpoint_A=newPoint();Pointpoint_B=newPoint(5,7);}701.10对象的构造函数构造函数应包含哪些内容?构造函数多半定义一些初值或内存配置工作一个类可以有多个构造函数(重载),根据参数的不同决定执行哪一个.如果程序中没有定义构造函数,则创造实例时使用的是缺省函数,它是一个无内容的空函数.711.10对象的构造函数thisthis指自己这个对象this的作用是要将自己这个对象当作参数,传送给别的对象中的方法.classThisClass{publicstaticvoidmain(){Bankbank=newBank();bank.someMethod(this);}}classCircle{intr;Circle(intr){this.r=r;}publicarea(){returnr*r*3;}}72super指这个对象的父类super用来引用父类中的方法及变量数据.publicclassappleextendsfruits{publicapple(intprice){super(price);}}以上句子表示使用超类的构造函数生成实例super必须是子类构造器的第一条语句1.10对象的构造函数73小结一个Java程序(包括小应用程序)由若干个类组成,它们分布在由CLASSPATH指定的一个目录中一个Java程序中只能由一个主类,并且与文件同名.CLASSPATH指定多个目录,它们和起来被看成是这个目录的根,根中的类构成缺省包目录树中每个子目录中的类的集合对应Java一个包(package),子目录的层次与包的记法的层次对应74小结C:\javabinlibjavacjavaappletviewerjavasourcemyclass让PATH包含…\java\binSETCLASSPATH=.;C:\...\myclassesimportjava.io.*;importjava.awt.Graphics;importmycalss.calculate.*;publicclasstest{}calculateABCclassA{}classB{}classC{}75小结名空间及访问规则--package,class/object,member,局部变量--public,private,protected,default成员的可视性描述publicprotected缺省privateyesyesyesyesyesyesyesyesnoyes*nonoyesnonono同一类中同一包中不同包的子类中非子类也不同包76小结对象模型Java的类和对象(一般,抽象,接口)--继承机制(单继承,多实现)static,import,final的含义和作用77小结避免在类中使用太多的基本类型privateStringsenderName;privateStringsenderStreet;privateStringsenderCity;privateStringsenderState;privateStringsenderZip;privateStringreceiverName;privateStringreceiverStreet;privateStringreceiverCity;privateStringreceiverState;privateStringreceiverZip;addresssenderaddressreceiver78第2章Java小应用北京大学计算机系代亚非79第2章Java小应用2.1所有小应用程序的根源2.2小试身手2.3图形操作2.4URL类2.5载入现有图像文件2.6动画效果2.7播放声音2.8小结802.1所有小应用程序的根源2.1.1小应用的特点回忆一下小应用程序的书写格式

importjava.applet.*;publicclassMyAppletextendsApplet{;}applet都继承自类,由Sun公司事先定义好了.每个小应用都有一个主程序类,之前必须加上public.812.1所有小应用程序的根源http://someLocation/file.html1.BrowserloadsURL<Html><Appletcode=….></Applet>2.BrowserloadsHTMLdocumentAppletclass3.BrowserloadsappletclassesLocation:http://someLocation/file.htmlLoading...4.Browserrunapplet822.1所有小应用程序的根源Applet的限制appletBrowserSERVER本地程序fileSERVERlocalconnectionconnectionApplet被下载的与applet无关的本地方法832.1所有小应用程序的根源2.1.2applet的生命周期paint()虽不在生命周期内,但它的作用相当于applet的灵魂publicvoidinit()publicvoiddestroy()publicvoidstart()publicvoidstop()publicvoidpaint(Graphicsg)842.1所有小应用程序的根源一个applet的可视周期initstartstopdestroy离开web页面重新装入或改变页面大小或返回Web页面852.1所有小应用程序的根源有关paint()方法Applet本身是一个容器,因此任何输出都必须用图形方法paint()当小应用首次被装载,以及每次窗口放大、缩小、刷新时都要调用paint方法paint()是由浏览器调用的,而不是由程序调用,当程序希望调用paint方法时,用repaint命令paint方法的参数是Graphics类的对象g,它在内paint(Graphicdg){。。。}862.1所有小应用程序的根源AWTthread(waiting)update(){cleararaecallpaint()paint()repaint()Exposure872.2小试身手2.2.1起始页上的时间和日期介绍两个类:1.类名:Date

创建一个实例DatetimeNow=newDate();2.类名Font

创建一个实例FontmsgFont=newFont(“TimesRoman”,Font.ITALIC,30);0MonDec0714:23:50GMT+08:001998882.2小试身手

看下面的例子,想一想生命周期的四个方法哪去了?importjava.awt.*;importjava.util.Date;{DatetimeNow=newDate();FontmsgFont=newFont(“TimesRoman”,Font.ITALIC,30);publicvoidpaint(Graphicsg){g.setFont(msgFont);g.setColor(Color.blue);g.darwString(timeNow.toString(),5,50);}892.2小试身手2.2.2在起始页中加入applethtml中有关的代码

<APPLETCODE=“showdate.class”width=600height=80></APPLET>CODEBASE的作用当class文件与起始页文件不在同一个目录下时,使用CODEBASE说明

<APPLETCODE=“showdate.class”width=600height=80>

CODEBASE=“\myjava\class”</APPLET>902.2小试身手<APPLETCODE=“showdate.class”width=600height=80>CODEBASE=“\myjava\class”</APPLET>C:\publicIndex.htmlmyjavaclassshowdatejavacodeC:\publicIndex.htmlmyjavaclassshowdatejavacode<APPLETCODE=“showdate.class”width=600height=80></APPLET>912.2小试身手ALIGN,HSPACE,VSPACEJavaapplet其它文字其它文字vspacehspace<APPLETCODE=“showdate.class”width=600height=80>vspace=100hspace=100</APPLET>922.2小试身手向applet传递参数的两个步骤

1.在起始页中要有<PARAM>标签

2.在applet中要有getParameter方法在起始页中有:<appletcode=showdatewidth=600heigt=80><paramname=remvalue=“时间是:”></applet>在applet中有:stringtitle=getParameter(rem);在显示时间的命令中加入title:g.drawString(title+timeNow.toString(),5,50);932.2小试身手importjava.awt.*;importjava.util.Date;{DatetimeNow=newDate();Stringtitle;FontmsgFont=newFont(“TimesRoman”,Font.ITALIC,30);publicvoidinit(){title=getParameter(“rem”);if(title==null)title=“”;}publicvoidpaint(Graphicsg){g.setFont(msgFont);g.setColor(Color.blue);g.darwString(title+timeNow.toString(),5,50);}942.2小试身手例:利用一个可以显示运行字符串的类,显示自己的字符串(htmlpara.html)<appletcode=htmlpara.classwidth=300heigh=200><paramname=MESSAGEvalue=”thisisatest"><paramname=FONTvalue="BOLD"><paramname=POINT_SIZEvalue=20></applet>952.2小试身手publicvoidinit(){ Stringparamete; parameter=getParameter("MESSAGE"); if(parameter!=null) message=parameter;parameter=getParameter("FONT"); if(parameter!=null) font_to_use=parameter;parameter=getParameter("POINT_SIZE");if(parameter!=null) point_size=Integer.parseInt(parameter);}962.3图形处理图形坐标系统任何与绘图有关的操作第一个要用的是类Graphics类的对象不是由new产生的,而是由系统或其他方式直接将生好的Graphics对象当作方法的参数,再交给程序设计者去处理.例如:paint(Graphicsg)xy0972.3图形处理Graphics的方法paint(Graphicsg){g.clearRect(); g.copyArea();g.drawAre();g.drawLine();g.drawOval();g.drawRect();g.drawPolygon();g.fillArc();g.fillOval();g.fillPolygen();g.fillRect();g.getColor(); g.getFont()g.setFont();g.setColor(); g.getFontMetrics()g.fillRoundRect()}982.3图形处理2.3.2字型和颜色的设置

字型设置的方法

Fontfont=newFont(“TimesRoman”,Font.ITALIC,24);g.setFont(font);在小应用程序中显示输出的方法

g.drawString(String,intx,inty);g.drawChars(chardata[],intoffset,intlength,intx,inty);992.3图形处理g.drawBytes(bytedata[],intoffset,intlength,intx,inty);例:g.drawString(“Thisisatest”,5,10);获取字体的属性

Fontfont=g.getFont();Font类中常用的方法

GetFamily() getName() getSize() getStyle()isItalic() isPlain() isBold() toString() 1002.3图形处理importjava.awt.Graphics;importjava.awt.Font;{Fontfn=newFont("TimesRoman",Font.ITALIC,20); publicvoidpaint(Graphicsg) {g.setFont(fn); g.drawString(”Fontdemo”,5,10);}}Fontdemo1012.3图形处理获取更详细的数据 请查阅有关FontMetrics类的方法

fontMetrics=getFontMetrics(font);FontMetrics中比较重要的方法有:stringWidth,charWidth,getAscent,getDescent,getLeading,getHeigh1022.3图形处理

颜色的调整Color对象的使用创造自己的颜色:Colormycolor=newColor(intred,intblue,intgreen);g.setColor(Color.yellow)g.setColor(mycolor);例:随机产生颜色,并画圆1032.3图形处理importjava.awt.Graphics;importjava.awt.Color;publicclassdrawcircleextendsjava.applet.Applet{ publicvoidpaint(Graphicsg){ intred,green,blue,x; for(x=0;x<370;x+=30){red=(int)Math.floor(Math.random()*256); green=(int)Math.floor(Math.random()*256); blue=(int)Math.floor(Math.random()*256); g.setColor(newColor(red,green,blue)); g.fillOval(x,0,30,30); }}}1042.4URL类2.4.2构造URL类(全名java.lang.URL)绝对URL的构造方法:URL(Stringspec)例:URLurl=newURL(:///cv/index.html”)相对URL的构造方法:某绝对地址在该目录下有两个文件

1052.4URL类URLbase=newURL(“://”);URLurl1=new(base,“mywork.html”);URLurl2=new(base,“mywork.html”);其他URL的构造方法:URLurl=newURL(“”,“”,“/~dyf/test.html”);1062.4URL类2.4.3获取小应用程序HTML页面的URL和小应用程序本身的URLURLhtml=getDocumentBase();System.out.print(html);URLcodebase=getCodeBase();System.out.print(codebase);浏览器服务器htmlappletwebpage1072.4URL类2.4.4URL异常(MalformedURLException)

当创建URL时发生错误,系统会产生异常

try{URLurl=newURL(str);}catch(MalformedURLException(e){DisplayErrorMessage();}2.4.5URL类的基本方法

StringgetProtocol(),StringgetHost(),inggetPort(),StringgetFile(),StringgetRef()1082.4URL类构造URL的实例import.URL;import.MalformedURLException;publicclassTest{URLurl1,url2,url3;voidtest(){try{url1=newURL(“file:/D:/image/example.gif”);url2=newURL(“:///cv/”);url1=newURL(url2,“hit.gif”);}catch(MalformedURLExceptione);//处理例外}}}1092.5载入现有图像文件Image类java支持gif和jpg两种格式的图像图像文件的URL:URLpicurl=newURL(“:///Applet/img1.gif”);取一幅图像构成图像对象Imageimg1=getImage(picurl);Imageimg2=getImage(getCodeBase(),“img2.gif”);1102.5载入现有图像文件显示一幅图像:g.drawImage(img1,x,y,this);g.drawImage(img1,x,y,Color.red,this);

g.drawImage(image1,x,y,x2,y2,Color.red,this);规定背景规定尺寸1112.5载入现有图像文件完整的过程不要忘记AWT包定义Image对象了吗?指定图像的URL了吗?把图像取出来吧.还记得画图像用什么方法和命令吗?在类中在init0中在paint0中1122.5载入现有图像文件importjava.applet.*;importjava.awt.*;publicclassimageextendsApplet{ Imageimg;publicvoidinit(){img=getImage(getCodeBase(),"img0001.gif");}publicvoidpaint(Graphicsg){intwidth=img.getWidth(this); intheight=img.getHeight(this);g.drawRect(52,52,width+30,height+30);g.drawImage(img,57,57,width+20,height+20,this);}}1132.6动态效果线程的应用2.4动态效果线程的应用什么是线程?

线程是执行中的程序中的单个顺序控制流.Java支持多线程开始显示进度引出最后结果数学运算线程1线程21142.6动态效果线程的应用静态的情况importjava.applet.*;importjava.awt.Graphics;publicclassmagueeextendsApplet{ publicvoidpaint(Graphicsg) { g.drawString("Hello,Java!",0,0); }}1152.6动态效果线程的应用动态的情况(不是多线程)publicvoidinit(){ x=size().width; y=size().height/2; width=x;}publicvoidpaint(Graphicsg){while(true){ g.drawString("Hello,Java!",x,y); x-=10; if(x<0) x=width;}} 1162.6动态效果线程的应用实现一个线程让Applet类去实现Runable接口,创建一个线程类改写方法start,在其中产生一个新的线程来工作改写stop方法,在其中编写结束线程的程序代码引入新的方法,将分给线程的工作写到run中1172.6动态效果线程的应用第一步:实现Runable接口publicclassxcextendsjava.applet.AppletimplementsRunnable{Threadsmallthread=null;…}Thread是一个类,只有是它的实例才能具有线程的功能主函数中要定义一个线程变量1182.6动态效果线程的应用第二步:改写方法startpublicvoidstart(){if(smallthread==null)

{smallthread=newThread(this);

smallthread.start();//从现在开始程序由两个线程在执行

}}第三步:改写stop方法publicvoidstop(){smallthread.stop();//停止线程

smallthread=null;//释放线程对象}1192.6动态效果线程的应用第四步:新的方法run将让线程要做的事放run中publi

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论