【文档说明】第一章Java的类pp课件.ppt,共(76)页,582.013 KB,由小橙橙上传
转载请保留链接:https://www.ichengzhen.cn/view-45208.html
以下为本文档部分文字说明:
1第一章Java的类北京大学计算机系代亚非2第一章Java的类•1.1有关面向对象的概念•1.2Java语言的特点•1.3Java的开发环境•1.4第一个Java程序•1.5Java类型系统•1.6Java中字符串的类•1.7Java中的类、方法和变量•1.8Java名空间及访问规则
•1.9Java中的抽象类、接口和程序包•1.10对象的构造函数31.1有关面向对象的概念•面向对象程序设计围绕的几个主要概念:•抽象数据类型、类、类型层次(子类),继承性、多态性。41.1有关面向对象的概念classCar{intcolor_number
;intdoor_number;intspeed;voidbrake(){…}voidspeedUp(){…};voidslowDown(){…}}计算机中的对象的原型现实生活中的对象•数据抽象类型51.1有关面
向对象的概念•什么是类?•类是描述对象的“基本原型”,它定义一种对象所能拥有的数据和能完成的操作,在面向对象的程序设计中,类是程序的基本单元。variablesmethods•程序中的对象是类的一个实
例,是一个软件单元,它由一组结构化的数据和在其上的一组操作构成。61.1有关面向对象的概念•变量:即指对象的所知道的状态•方法:指对象的功能单元。•什么是消息?•软件对象通过相互间传递消息来相互作用和通信•一个消息由三部分组成:•1.接受消息的对象•2.要完成方法的名字•3
.方法需要的参数对象B对象Amessage71.1有关面向对象的概念•一个例子•在程序中操作对象是类的一个实例:即对象•创建一个对象Helloobj=newHello();•调用方法obj.showString(“HelloWorld!”)classHello{}priv
ateStrings;publicvoidshowString(){System.out.println(s);}publicvoidchangeString(Stringstr){s=str;return
s;}81.1有关面向对象的概念•什么是封装?•封装把对象的所有组成部分组合在一起,封装定义程序如何引用对象的数据,封装实际私有数据方法上使用方法将类的数据隐藏起来,控制用户对类的修改和访问数据的程度。方法数据对象A对象B公有数据
91.1有关面向对象的概念•什么是子类?•子类是作为另一个类的扩充或修正所定义的一个类.bicycle(superclass)MountainbikesRacingbikesTandembikessubclass101.1有关面向对象的概念•什么
是继承?•继承是子类利用父类中定义的方法和变量就像它们属于子类本身一样.classCar{intcolor_number;intdoor_number;intspeed;push_break(){…}add_oil(){…}}classTras
h_CarextendsCar{doubleamount;fill_trash(){…}}111.1有关面向对象的概念•什么是方法的覆盖?•在子类中重新定义父类中已有的方法。classCar{intcolor_number;intdoor_number;in
tspeed;push_break(){speed=0;}add_oil(){…}}classTrash_CarextendsCar{doubleamount;fill_trash(){…}push_break(){speed=speed-10;}}121
.1有关面向对象的概念•什么是方法的重载(多态性)?•在同一个类中至少有两个方法用同一个名字,但有不同的参数。类voidshow(intint_num)voidshow(doubledouble_num)voi
dshow(nitnit_um,floatfloat_um)1231.23123,1.23131.2Java语言的特点•Java是什么?Java=“C++”--“复杂性和奇异性”+“安全性和可移植性”•Java由那些特性?•(1)面向对象•封装性、多态性、继承性、动态链接
•(2)操作平台无关性•严格的语言定义:“没有依据机器的不同而不同”或“由编译器决定”等字眼,最后的目标码都是一致的,初值都是确定的141.2Java语言的特点•两种工作模式的比较源程序Java编译器SPARCpentiumPower
pc中间码PowerpcpentiumSPARC二进制源程序SPARCPowerpcpentiumPowerpcpentiumSPARC编译器二进制Java解释器151.2Java语言的特点•.编译,没有绝对地址调入包含,继承所用道的所有类,内存分配确定,编程真正可执行的机器码Java源程序(.j
ava文件)Java编译器JavaBytecode(.class文件)系统执行平台Bytecode解释器Bytecode载入器字节码校验器不存在伪造的指针不违反访问权限不非法访问对象不导致操作栈溢出16
1.2Java语言的特点•Java虚拟机JavainterpreterJust-in-timecompilerRuntimeSystemOperatingSystemHardware不同的操作系统有不同的虚拟
机.它类似一个小巧而高效的CPU.byte-code代码是与平台无关的是虚拟机的机器指令.Java字节代码运行的两种方式:interpreter(解释方式)Just-in-time(即时编译):有代码生成
器将字节代码转换成本机的机器代码,然后可以以较高速度执行.171.2Java语言的特点•(3)安全问题•Java是在网络环境下使用的语言•一个安全的网络至少要防止以下几种破坏的可能性:•毁灭系统资源•消耗系统资源•挖掘系统或个人机密•骚扰正常工作的进行181.2Java语
言的特点Java源程序(.java文件)Java编译器JavaBytecode(.class文件)Bytecode载入器Bytecode解释器系统执行平台语言定义publicprotectedprivatefinal取消指针自动回收垃圾Bytecode检查限定对象的存取权限系统
堆栈溢出参数类型一致程序执行系统WWW浏览器限制Java小应用程序的不正当使用191.2Java语言的特点•(4)多线程•Java提供现成的类Thread,只要继承这个类就可以编写多线程的程序。•(5)Java与C及C++的区别•不再有#include和#define等于处理功能•不
再有structure,union及typedef•不再有函数、不再有指针、不再有多重继承•不再有goto•不再有操作符重载(OperatiorOverloading)•取消自动类型转换,要求强制转换201.3Java的开发环境•Jav
a开发环境JDK•JDK中有Java编译器和bytecode解释器Applwtviewer是小应用程序的bytecode解释器•JDK的安装•直接执行JDK.exe211.3Java的开发环境产生如下目录结构java\bin的目录下包含义下主要文件:javac:Java编译器,用来
将java程序编译成Bytecodejava:Java编译器,执行已经转换成Bytecode的java应用程序.jdb:Java调试器,用来调试java程序javap:反编译,将类文件还原回方法和变量.javadoc:文档生成器,创建HTM
L文件appletviwer:Java解释器,用来解释已经转换成Bytecode的java小应用程序.221.3Java的开发环境•\java\lib子目录•库函数,其中classese.zip不要解开.•在autoexec.bat中加入以下两条命令1.PATHc:\
…\java\bin2.SETCLASSPATH=.;c:\...\lib\classes.zip;c:\myclasses;231.3Java的开发环境C:\javabinlibclasses.zipj
avacjavaappletviewer用户类文件所在目录myclasses当前目录241.3Java的开发环境•vj1.1++的使用•1.进入vj,创建一个project•2.加入java文件•3.编辑java文件•4.编译java文件•5.Build一个p
roject文件•6.运行java程序--如果是小应用程序,则直接在VJ环境下运行--如果是应用程序,则在dos下运行251.4你的第一个Java程序•编辑存盘:主类名(含有main方法)和文件名要一致性HelloWorldApp.
java•编译程序:javacHelloWorldApp.java•运行程序:javaHelloWorldApp“myjava”•运行结果:Hi,myjavaclassHelloWorldApp{publicstaticvoidmain(Stringargs[]){Sys
tem.out.println(“Hi,”+args[0]);}}•Java应用和Java小应用程序261.4你的第一个Java程序1.声明一个类:publicclassHelloWorldApp{},类名的第一个字母要大写2.一个类中可有很多方法,main方法是运行程序的第一
个方法,方法名的第一个字母要小写.3.System.out.println是向屏幕输出,相当于C中的printf();publicclassHelloWorldApp{publicstaticvoidmain(Str
ingargs[]){System.out.println(“Hi,”+args[0]);}}271.4你的第一个Java程序4.命令行参数的获取c:>javaHelloWorldAppmyjava!6.字符串的拼接publicclassHelloWorldAp
p{publicstaticvoidmain(Stringargs[]){System.out.println(“Hi,”+args[0]);}}281.4你的第一个Java程序Java小应用程序不能直接执行和使用,必须要在浏览器中执行imp
ortjava.applet.Applet;importjava.awt.*;publicclassHelloAppletextendsApplet{publicvoidpaint(Graphicsg){g.drawString(“HelloWorld”,0,50);}}编辑存盘:主类名(ex
tendsApplet)和文件名一致编译代码:javacHelloApplet.java编写HTML文件:HelloApplet.html291.4你的第一个Java程序•运行applet程序:1.appletviwerHelloApple
t.html2.在浏览器中运行•运行结果:HelloWorld!<html><body><appletcode=“HellApplet.class”width=200height=100></applet></body></htm
l>301.4你的第一个Java程序•理解程序1.import语句相当于C语言中的include每2.每一个applet都是java.applet.Applet的子类用extends继承3.applet中没有main方法importja
va.applet.Applet;importjava.awt.*;publicclassHelloAppletextendsApplet{publicvoidpaint(Graphicsg){g.drawString(“He
lloWorld”,0,50);}}311.4你的第一个Java程序4.当applet被浏览器运行时,paint语句自动执行5.在applet中与屏幕输出有关的操作通过Graphics对象来实现6.一个Java源文件内最多只能有一个public类,称为主类,且必须和文件名
同名importjava.applet.Applet;importjava.awt.*;publicclassHelloAppletextendsApplet{publicvoidpaint(Graphicsg){g.drawString(“HelloW
orld”,0,50);}}321.5Java类型系统Javatypesystemprimitivereferencenullcharnumericbooleanclassinterfacearrayintegralfloating-pointbyteshortint
longfloatdouble331.5Java类型系统•byte8位2的补码(byte)0•short16位2的补码(short)0•int32位2的补码0•long64位2的补码0L•float32
位IEEE754浮点数标准0.0f•double64位IEEE754浮点数标准0.0d•char16位同一码字符集‘\u0000’•(Unicodecharacter)341.5Java类型系统•程序:保留字,标识符(类名、域名、方法名、符号常量、局部变量,标号、…),操作符、界定符,字面常量。
•声明一个变量•intdata=10;BooleanisAlived;•Java中的操作符:与C基本一致•Java中不再有指针了351.5Java类型系统•在Java中”引用“是指向一个对象在内存中的
位置,在本质上是一种带有很强的完整性和安全性的限制的指针.•当你声明某个类,接口或数组类型的一个变量时,那个变量的值总是某个对象的引用或者是null引用.•指针就是简单的地址而已,引用除了表示地址而外,还象被引用的数据对象的缩影,还提供其他信
息.•指针可以有++,--运算,引用不可以运算.361.5Java类型系统s1s210001s2=s1;astring10001classMydate{intyear;intmonth;intday;}Mydatetoday=new
MyDate()00010008todays1=“astring”;例:Strings1;Strings2;371.5Java类型系统•能够动态取得的内存有两种,一种是对象实体,一种数组.•Java用new申请内存,不需要自己释放不用的内存.•在Java中,定义数组时不必给出数组的大小,因为Ja
va的数组是动态分配的。•数组变量实际上是一个引用变量,因此要实例化才能使用。•例:intArray[];Array=newint[8];381.5Java类型系统•例:StringarrayOfString[]=ne
wString[10];每个数组元素包含一个对字符串对象的引用,此时值分配了包含字符串引用的空间,并没有对字符串本身分配内存,此时不能访问。arrayOfStringfor(inti=0;i<arrayString.l
ength;i++)arrayOfString[i]=newString(“Hello”+i)arrayOfString[0]arrayOfString[1]arrayOfString[8]arrayOfString[9]对数组的引用对
字符串的引用391.6Java中的字符串•Java中的字符串类•String和StringBuffer•String类的定义和实例的生成•例:Stringstr;•str=“thisisastring”•或:Stringstr1=newString(“hello”);•或:Strings
tr2=“aaaa”;•String类与其它类型的转换•例1:将实型数转换成字符串•System.out.println(String.valueOf(Math.PI));.401.6Java中的字符串•有两个字符串str1,str2•str1=s
tr2;是指两个引用指向同一个地址•str1.equals(str2)•是指两个字符串内容相等•获取String对象的信息•例如:Strings=“thisisastring”;•intlen=s.length();•booleanres
ult=s.equal(“thisisa特test”);•charch=s.charAt(6);411.6Java中的字符串•StringBuffer的字符串的内容是可以改变的•创建StringBuf
fer对象•StringBufferstr=newStringbuffer(“hello”);•获取StringBuffer对象的信息•intlen=str.length();例:StringBuffersb=newStringBuffer(“DrinkJava!”);sb.ins
ert(6,”Hot”);System.out.println(sb.toString());DrinkHotJava!System.out.println接受的是String类421.7Java中的类、方法和变量•试用一个简单的类classCar{intcar_number;voidset_n
umber(intcar_num){car_number=car_num;}voidshow_number(){System.out.println(“MycarNo.is:”+car_number);}}classCarDem
o{publicstaticvoidmain(Stringargs[]){CarDemocar=newCar();DemoCar.set_number(3838);DemoCar.show_numbe
r();}}Mycarnumberis3838431.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_c
apacity){capacity=trash_car_capacity;}voidshow_capacity();{System.out.println(“Mycapacityis:”+capacity);}}441
.7Java中的类、方法和变量•TrashCar中继承了Car中的两个方法classCarDemo{publicstaticvoidmain(Stringargs[]){TrashCarDemoTrashCar=newTrashCar();D
emoTrashCar.set_number(4949);DemoTrashCar.set_capacity(20);DemoTrashCar.show_number();DemoTrashCar.show_capacity();}}Car是父类,TrashCar是子类451.7Java中的类、
方法和变量•何时选择继承性?•一个很好的经验:“B是一个A吗?”•如果是则让B做A的子类.常犯的错误A有一个B吗?例如让汽车轮子成为汽车的子类是错误的461.7Java中的类、方法和变量•类的严格定义及修饰字[类的修饰字]class类名称[extends父类名
称]{….}public,abstract,final或者没有[变量修饰字]变量数据类型变量名1,变量名2[=变量初值]…;[方法修饰字]方法的返回值类型方法名称(参数1,参数2,…{…//方法的内容}•方法和变量的定义及修饰字public、protected、pr
ivate471.8Java名空间及访问规则•每个类都创造了有自己的名字空间,指方法和变量可以知道彼此的存在,可以使用。•abstract类不能直接产生属于这个类的对象•final类不能被其他任何类所继承(
安全的考虑)•public类不但可以被同一程序包中的其它类使用,别的程序包中的类也可以使用.•friendly(缺省)类只能被本包中的其它类使用481.8Java名空间及访问规则•变量和方法的修饰字public、protected、private•public:任何其
它类、对象只要可以看到这个类的话,那么它就可以存取变量的数据,或使用方法。classABC{publicintpub_i=5;publicvoidshow)(){System.out.println(“pub_i”+pub_i);}491.8Java名空间及访问规则c
lassDemo{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;5
01.8Java名空间及访问规则•protected变量和方法•如果一个类中变量或方法有修饰字protected,同一类,同一包可以使用。不同包的类要使用,必须是该类的子类可以存取变量或调用publicclassABC{protectedintpro_i=5;protectedvoidshow(
){System.out.println(“pro_i=”+pro_i;)}}511.8Java名空间及访问规则•不同中的类不能使用classDEF{publicstaticvoidmain(Stringargs[]){ABCabc=newABC();System
.out.println(“abc.pro_i=“+abc.pro_i);abc.pub_i=10;abc.show();}}52importmytest.pack.ABC;classDEFextendsABC{publicstaticvoidmain
(Stringagrs[]){DEFdef=newDEF();System.out.println(def.i);def.i=10;def.show();}}pro_i=5pro_i=101.8Java
名空间及访问规则•不同包但是是子类531.8Java名空间及访问规则•private•不允许任何其他类存取和调用•friendly(前边没有修饰字的情况)•在同一程序包中出现的类才可以直接使用它的数据和方法.541.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(Stringarg
s[]){Cc=newC();c.println_out();}}551.8Java名空间及访问规则•方法的覆盖(overriding)和重载(overloading)•子孙类中定义的方法和祖先类中某个方法同名,同参数行,则祖先类中的该方法被覆盖.•方法的重载是指一个
对象的多态性,即多个方法用相同的名称,但参数行不同.类voidshow(intint_num)voidshow(doubledouble_num)voidshow(nitnit_um,floatfloat_um)1231.23123
,1.23561.8Java名空间及访问规则•到此为止-----final•final在方法之前,防止该方法被覆盖.•final在类之前,标是该类不能被继承•final在变量之前,定义一个常量.•属于类的变量和方法----static•s
tatic在变量或方法之前,表明它们是属于类的,classABCD{chardata;staticint_share_data;}classDemo{ABCDa,b,c,d}objectbchardataobjectcchardataObjectbchardatastaticintshare
_dataobjectbchardata571.8Java名空间及访问规则•静态变量在各实例间共享•如果是public静态变量,则其它类可以不通过实例化访问它们•静态方法称为类的方法,因此不用实例化即可调用(面向过程)•一个对象的方法可以访问对象的数据成员,尽管不属
于方法的局部变量•一个类的方法只能访问自己的局部变量581.8Java名空间及访问规则•例:不正确的引用•classStaticError•{Stringmystring=“hello”;•publicstaticvoidmain(Stringargs[])•{System.out.pr
intln(mystring);}•}•错误信息:can’tmakeastaticreferencetononstaticvariable.•为什么不正确?只有对象的方法可以访问对象的变量.591.8Java名空间及访问规则•解决的办法:•1.将变量改称类变量•cl
assStaticError•{staticStringmystring=“hello”;•publicstaticvoidmain(Stringargs[])•{System.out.println(mystring);}•}601.8Java名空间及访问规则•2.先创建一个类的实
例•classNoStaticError•{•publicstaticvoidmain(Stringargs[])•{Stringmystring=“hello”;•System.out.println(mystring);}•}•}611.9Java中的抽象类、接口和程序包•抽象类是指不能
直接被实例化的类,因此一般作为其它类的超类,与final类正好相反•抽象类中的抽象的方法-在该类中定义但不在该类中提供实现,由继承类提供细节•publicabstractclassSomeAbstractClass•{voidmethod1()•{Syst
em.out.println(“Hi,Java”);}•voidmethod2();•}•定义抽象方法的类必须是抽象类.621.9Java中的抽象类、接口和程序包//已有两个类Circle和Rectangle,完成相关参数的计算cl
assCircle{publicintr;Circle(intr){this.r=r}//this指"这个对象的"publicintarea(){return3*r*r;}//取近似}classRectange{publicintwidth,height;//这里不需"this"Rect
angle(intw,inth){width=w,height=h;}publicintarea(){returnwidth*height;}}631.9Java中的抽象类、接口和程序包•假设有若干个Circle,以及若干个Rectangle,希望
计算它们的总面积,直截了当的做法是将它们分别放到两个数组中,用两个循环,加上一个加法,这种做法是不漂亮的•如果还有其它形状,triangle,ellipses等,上述方法显得“累赘”,我们希望有一种统一的
表示,例如用一个数组shape[],接受所有的形状,然后用•for(i=0;i<shape.length;i++){•area_total+=shape[i].area();641.9Java中的抽象、接口
和程序包abstractclassShape{abstractfloatarea();}classCircleextendsShape{publicintr;Circle(intr){this.r=r;}pu
blicfloatarea(){return3.14*r*r;}}classSquareextendsShape{publicintwidth,height;Rectangle(intw,inth){width=w,height=h;}publicfloata
rea(){returnwidth*height;}}651.9Java中的抽象类、接口和程序包•利用接口可实现多重继承(可同时实现多个接口)•接口的作用和抽象类类似,指定原型,不直接定义方法的内容.•关键字implement用来实现方法,即在使
用时要用给出方法的实际内容•接口中的方法和变量•是public的interfaceStack{voidpush(objectx);objectpop();}classAextendsAppletimplementsStack{voidpush(objectx){…;//具体内容}object
pop(){…;//具体内容}}661.9Java中的抽象类、接口和程序包•程序包:相当于其它语言中的库函数•打包packageGraphics;classSquare{…;}classCircle{…;}classTriangle{…;}•使用程序包中的类要用import命令.表示路径,*表
示使用包中的所有类•importjava.io.FileInputStream;•importjava.io.*;iojavaFileInputStream671.10对象的构造函数•使用new来做内存配置classDemo1//数组的配置{publicstaticvo
idmain(Stringargs[]){intarray[][];array=newint[5][5];array[1][4]=5;}}classmyClass//对象实体的产生{intdata=5;}classDemo2{
publicstaticvoidmain(Stringargs[]){myClassobj;//建立一个引用obj=newmyClass();System.out.println(obj.data);}}681.10对象的构造函数•Constructor和finalizer•
constructor(构造函数),在一个类中和类同名的方法叫构造函数.系统在产生对象时会自动执行.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);}691.10对象的构造函数•构造函数应包含哪些内容?•构造函数多半定义一些初值或内存配置工作•一
个类可以有多个构造函数(重载),根据参数的不同决定执行哪一个.•如果程序中没有定义构造函数,则创造实例时使用的是缺省函数,它是一个无内容的空函数.701.10对象的构造函数•this•this指自己这个对象•this的作用是要将自己这个对象当作参数,传送给别的对象中的方法.classThi
sClass{publicstaticvoidmain(){Bankbank=newBank();bank.someMethod(this);}}classCircle{intr;Circle(intr){this.r=r;}p
ublicarea(){returnr*r*3;}}71•super指这个对象的父类•super用来引用父类中的方法及变量数据.•publicclassappleextendsfruits•{publicapple(intprice)•{super(price
);}•}•以上句子表示使用超类的构造函数生成实例•super必须是子类构造器的第一条语句1.10对象的构造函数72小结•一个Java程序(包括小应用程序)由若干个类组成,它们分布在由CLASSPATH指定
的一个目录中•一个Java程序中只能由一个主类,并且与文件同名.•CLASSPATH指定多个目录,它们和起来被看成是这个目录的根,根中的类构成缺省包•目录树中每个子目录中的类的集合对应Java一个包(package
),子目录的层次与包的记法的层次对应73小结C:\javabinlibclasses.zipjavacjavaappletviewerjavasourcemyclass让PATH包含…\java\binSETCLASSPAT
H=.;C:\...\myclassesimportjava.io.*;importjava.awt.Graphics;importmycalss.calculate.*;publicclasstest{}myjava.javacalculateABCpackagemyclass.calculat
eclassA{}classB{}classC{}74小结•名空间及访问规则•--package,class/object,member,局部变量•--public,private,protected,default成员的可视性描
述publicprotected缺省privateyesyesyesyesyesyesyesyesnoyes*nonoyesnonono同一类中同一包中不同包的子类中非子类也不同包75小结•对象模型•---Java的类和对象(一般,抽象,接口)•--继承机制(单继承,多实现)•static
,import,final的含义和作用76小结•避免在类中使用太多的基本类型•privateStringsenderName;•privateStringsenderStreet;•privateStringsenderCity;•privateStringsend
erState;•privateStringsenderZip;•privateStringreceiverName;•privateStringreceiverStreet;•privateStringreceiverCity;•privateStringreceiverState;•p
rivateStringreceiverZip;addresssenderaddressreceiver