【文档说明】Java课件第六讲Java面向对象程序设计.ppt,共(52)页,381.535 KB,由小橙橙上传
转载请保留链接:https://www.ichengzhen.cn/view-44830.html
以下为本文档部分文字说明:
第6讲Java面向对象程序设计面向对象的程序设计方法按照现实世界的特点,把复杂的事务抽象为对象。对象具有自己的状态和行为,通过对消息的反应来完成一定的任务。面向对象是Java的重要特性。一、Java面向对象基础(一)类的定义
Java的类是由类声明和类体二部分构成,类声明定义的格式如下:[类修饰符]class类名[extends父类名][implements接口名,[接口名]]{类体}例:HelloWorldApp.javapublicclassHelloWorldApp{publicstaticvoidmain
(Stringargs[]){System.out.println(“HelloWorld!”);}}类体定义的格式:class类名{变量声明;方法声明;}例:classPoint{intx,y;voidinit(intix,intiy){x=ix;y=iy;}}例:
publicclassCalculator{privatedoubleresult;publicdoublea,b;publicdoubleCalculator(){result=0;}publicdoubleAdd(){result
=a+b;returnresult;}publicdoubleMinus(){result=a-b;returnresult;}}组成一个类的组件如下:[import包][类修饰符]classxxxclass[extends父类][implements接口]{//类变量或称类字段//实例变量或
称实例字段//构造函数//静态初始者//类方法//实例方法//内部类}(二)类的修饰符public——提供给其他类完全的存取权限。即:在同一包中的类可自由取用此类,而别的包中的类可通过import关键词来引入此类所属的包加以运用。用public修饰的类有几个特性:1.一个程序里只能有一个类
被修饰为public,否则编译会错。publicclassxxxClass(){…}classaaaClass(){…}classbbbClass(){…}2.源文件存储文件名,必须是用public修饰的类名(xxxClass)3.若程序中没有任何pu
blic类,则文件名可任取。而如果文件名是程序中的一个类名,则该类被视作public,可供别的类存取。final——表示此类为“最终”类,别的类不能继承此类,其方法也不能被覆盖。例如java.lang.System类即为final类:publicfinalclassSystemext
endsObject注意:我们可使用该类,但不能继承并覆盖其内容。用重复的两个修饰符public+final的意思是:此final类可被import来引用,但不能被继承。System类关系到系统层级控制,为了安全性,故必须为final类,以避免被覆盖。但final与abstr
act就不能复合来用,因为二者是相冲突的。另外:final关键字也可用于修饰方法和变量,用final修饰的方法不能被覆盖,用final修饰的变量定义的同时必须赋初值且在程序中不能被赋值,final变量被认为是符号常量,习惯上用大写字母表示这
些变量。例:FinalTest.javafinalclassA{finaldoublePI=3.1416;finaldoublearea(doubler){return(PI*r*r);}}classFina
lTest{publicstaticvoidmain(Stringargs[]){Aa=newA();System.out.println("area="+a.area(5.0));}}abstract——此字的英文意思是
”抽象的”,”非实际的”。此修饰符可修饰类及方法。用abstract修饰的类只是先定义一些方法规格,然后让继承此类的子类来覆盖此规格的内容。即:抽象类不需给出类中每个方法的完整实现,要实现此方法必须要由子类的方法来覆盖。abstract类与
方法有下列特性:1.一个抽象类里可以没有定义抽象方法。但只要类中有一个方法是被声明为abstract,则该类必须为abstract。2.抽象类不能被实例化,即不能被new成一个对象实例。3.若一个子类继承一个抽象类,则子类需用覆盖的方式
来实化该抽象父类中的抽象方法。若没有完全实化所有的抽象方法,则子类仍是抽象的。4.抽象方法可再与public、protected复合使用,但不能与final、private和static复合使用。例:Abs
tract_Demo.javaabstractclassA{abstractvoidcallme();voidmetoo(){System.out.println("在A的metoo方法里");}}classBext
endsA{voidcallme(){System.out.println("在B的callme方法里");}}classAbstract_Demo{publicstaticvoidmain(Stringargs[]){Ba=newB();a.callme();a.metoo(
);}}例:抽象类示例默认修饰符如果一个类没有修饰符,就说明它具有默认的访问控制特性。这样的类只允许与该类处于同一个包中的类访问和调用,而不允许被其他包中的类使用。注意:Java中,外部类不能用private和protected修饰,内部类可以用private和prot
ected修饰。二、对象的创建和引用(一)对象的定义定义了用户自己的类之后,就可以用这个类去定义类的对象了。如:BoxmyBox;因为类可以当作是用户自行声明的复合数据类型,所以使用之前还需用new为其开辟存储空间。如:myBox=newBox();注:以上两步可合而为一BoxmyBox=ne
wBox();接下来,可以利用成员运算符“.”来访问对象的各个成员变量。如:myBox.color=“Blue”;myBox.width=10.5;总结:对象的创建包括“声明”、“实例化”、“初始化”三步:声明:类型对象名;实例化:用new可以为一个类实例化
多个不同的对象,这些对象分别占用不同的内存空间。初始化:执行构造函数。(二)对象成员变量的引用引用格式:对象名.成员变量名(三)对象方法的调用调用格式:对象名.方法名例:BoxClass.javaclassBox{Stri
ngcolor;doublewidth;doubleheight;doubledepth;doublevolume(){returnwidth*height*depth;}voidBoxMessage(){System.out.println(
"盒子的颜色:"+color);System.out.println("盒子的宽度:"+width);System.out.println("盒子的高度:"+height);System.out.println("
盒子的深度:"+depth);}}publicclassBoxClass{publicstaticvoidmain(Stringargs[]){BoxmyBox=newBox();doublemyBoxVolume,Volume;myBox.
color="Blue";myBox.width=10.5;myBox.height=20.6;myBox.depth=15.7;myBoxVolume=myBox.volume();Volume=myBox.width*m
yBox.height*myBox.depth;System.out.println("体积是:"+myBoxVolume);System.out.println("体积是:"+Volume);myBox.BoxMessage();}}Java中的变量成员
变量(在类中定义,不需要初始化)自动变量(在方法中定义,定义同时初始化)三、成员变量成员变量是类的两大组成部分之一,因此类体中定义的变量都称之为成员变量,而方法体中定义的变量不能称之为成员变量。类变量(由stati
c修饰)成员变量实例变量(没有static修饰)(一)成员变量的定义•格式:[变量修饰符]类型变量名[=初值][,变量名[=初值]];如:publicinta,b=12;protectedStrings=
"HotJava";注意:若成员变量在定义时没有赋初值,则系统会为其自动进行初始化,但方法中的自动变量必须人为的赋初值。(二)成员变量修饰符1.存取性修饰符:控制类间的存取,包括public,protected,private;2.存在性修饰符:成员变量本身在类中存在的特性,包
括static和final。public修饰符public变量和方法是“公开”的,既允许变量自身所属的类访问,也允许同一个包中的其他类访问,还允许其他包中的类访问。protected修饰符protected变量和方法是“受保护”的,它们仅能被与该类处于同一个包中的类所直接存取和使用。p
rivate修饰符private变量和方法是“私有的”,除了声明它们的类外,不能被任何其他的类直接存取和使用。注:当变量和方法前不加以上三种修饰符时,被认为是默认访问级,只允许定义它的类自身以及在同一个包中的类访问和调用。static修饰符用关键字static可以修饰
类的成员变量及方法,使它们成为静态成员。如:staticinty=3;staticshowx(){…}注意:用static修饰的变量称为类变量,用static修饰的方法称为类方法。类变量和类方法在使用时也和其他变量与方法不同。例:•UseStatic.j
ava•UseGeneral.java•StaticTest.javafinal修饰符将变量或方法声明为final,可以保证他们在使用中不被改变。注意:被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改;被声明为final的方法也同样只能使用,不能重载或
覆盖。例:FinalTest.javafinalclassA{finaldoublePI=3.1416;finaldoublearea(doubler){return(PI*r*r);}}classFinalTes
t{publicstaticvoidmain(Stringargs[]){Aa=newA();System.out.println("area="+a.area(5.0));}}四、成员方法(成员函数)在Java中,成员变量和成员方法(成员函数)是类的两大组成部分,成员变量
反映了类的性质,而方法(函数)反映了类的行为。(一)成员方法的声明声明格式:[方法修饰符]返回值类型方法名(参数表){方法体}说明:定义方法时一定要给出返回值类型和参数表;没有返回值时,返回值类型记为vo
id。如:publicstaticvoidmain(Stringargs[]){…}publicintarea(intlength,intwidth){returnlength,*width;}(二)成员方法修饰符方法修饰符大部分
的种类及意义与变量修饰符一样,不过多了一种存在性的abstract以及线程用的运作性修饰符—synchronized。存取性:public,protected,private存在性:static,abstract,final运作性:synchronized1.
static修饰符此修饰符会使方法成为唯一的。与类的地位等同。不会因实例的产生而受影响。static方法在使用上,有几点注意事项:(1)static方法中只能使用static变量,否则编译会出错。(2)一个类的static变量和static方法,可直接用该类的名称,按以下方法来使
用:类名.类方法类名.类变量类名.静态变量.静态方法2.abstract修饰符抽象方法存在于抽象类中,并不建立程序代码,而是留给继承的子类来覆盖。被声明为abstract的方法不需要实际的方法体,只需给出方法的名称、返回值类型和参数表。
格式:abstract返回值类型方法名(参数表);注:声明抽象方法时,并不用写出大括号{}。定义了abstract抽象方法的类必须被声明为abstract的抽象类。3.final修饰符被声明为final的方法不能被其他类变更方法里的内容,即使
是继承的子类。4.synchronized修饰符此方法修饰符用于同步化监控处理。被synchronized修饰的方法,一次只能被一个线程来使用。(三)成员方法调用1.简单调用:根据被调用的方法是否有返回值,有两种调用形式。(1)作为一条单独的语句(void)如:System.
out.println(“…”);(2)作为一个表达式(有返回值)如:s=area(3,4);例:SquareDouble.javapublicclassSquareDouble{publicstaticvoidmain(Stringarg[]){doublea=10
.0,x=0.0;x=square(a);System.out.println(“正方形面积是:”+x);}publicstaticdoublesquare(doubley){returny*y;}}2.根据调用方法的所在位置及其本身的性质,又分为几种不同情况。(1)被调用的方
法有可能是在本身这个类中,也有可能是在父类或其他的类中。(2)被调用的方法有可能是类方法,也有可能是实例方法。(3)主调方法有可能是类方法,也有可能是实例方法。方法调用的写法就要根据方法所在的位置及它本身的性质来进行调用。调用方法被调用方法类方法实例方法本类类方法A直接调用:[类
方法A]或[本类实例].[类方法A]但不能用this。直接调用:[类方法A]或[this].[类方法A]均可。实例方法B[本类实例].[实例方法B],但不能用this,也不能直接调用。直接调用:[实例方法B
]或[this].[实例方法B]均可。父类/其他类类方法C[父类实例].[类方法C]/[其他对象实例].[类方法C]。[父类实例].[类方法C]或[super].[类方法C]/[其他对象实例].[类方法C]。实例方法D[父类实例].[实例方法D]/[其他
对象实例].[实例方法D]。[父类实例].[实例方法D]或[super].[实例方法D]/[其他对象实例].[实例方法D]。上表的原则:1.this与super不能用在由static修饰的类方法里。若放在其中,则会产生编译错误信息:non-staticvari
ablethiscannotbereferencedfromastaticcontextnon-staticvariablesupercannotbereferencedfromastaticcont
ext2.在类方法中可直接调用本身类方法,但不可直接调用实例方法。3.在实例方法中可直接调用本身类中的类方法与实例方法。4.this与super只能用在实例方法中。5.〔xx对象〕.〔xx方法〕的方式可用于任何情况里。•例:TestMethod.java(四)成员方法参数的传递
参数可以是基本数据类型、数组和对象。例:ArrayMaxMin.java(参数是数组)importjava.applet.Applet;importjava.awt.Graphics;publicclassArrayMaxMinextendsApplet{publi
cvoidpaint(Graphicsg){doubleMax,Min;doubledata[]={0.2,5.6,7.88,20.3,-0.234,3.22};Max=ArrayMax(data);g.drawString("Ma
x="+Max,10,20);Min=ArrayMin(data);g.drawString("Min="+Min,10,40);}doubleArrayMax(doublearray[]){doublemax=array[0];for(inti=1;i<array.length;i+
+)if(array[i]>max)max=array[i];returnmax;}doubleArrayMin(doublearray[]){doublemin=array[0];for(inti=1;i<array.length;i++)if(array[i]<min)
min=array[i];returnmin;}}方法参数是类对象方法参数是类对象时,在方法体内可通过类的成员运算符“.”使用类的成员变量和方法。如:publicvoidpaint(Graphicsg){g.drawString(“HelloJava!”
,10,30);}例:PassingParam.javapublicclassPassingParam{staticclassOneObject{publicStringY="a";}staticvoidchangeParam(intxx,OneObjectoobject1){xx=3;oobje
ct1.Y="A";}publicstaticvoidmain(Stringargs[]){intx=1;OneObjectoobject=newOneObject();//创建对象oobjectSystem.ou
t.println("传递前的参数值:x="+x+"y="+oobject.Y);PassingParam.changeParam(x,oobject);//传递变量x和对象oobject地址System.out.println("传递后的参数值:x="+x+"y
="+oobject.Y);}}(五)finalize方法•相当于C++中的析构方法,用来释放对象所占用的系统资源。•当对象实例不被任何变量使用时,Java对自动进行垃圾回收,因此该方法会被Java系统自动调用。