ch4-类和对象课件_第1页
ch4-类和对象课件_第2页
ch4-类和对象课件_第3页
ch4-类和对象课件_第4页
ch4-类和对象课件_第5页
已阅读5页,还剩88页未读 继续免费阅读

下载本文档

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

文档简介

类和对象主要内容面向对象编程(OOP)的概念及特点Java中面向对象编程创建自定义类、接口和包类的继承构造函数类的多态性面向对象编程的概念公共数据函数函数函数函数算法+数据结构数据方法方法数据方法方法过程式程序设计OOP程序设计对象+消息消息面向对象编程的特点封装(encapsulation)实现了信息的隐藏及安全性提高了程序的模块化,且易于维护继承(inheritance)交通工具车船飞机汽车火车父类/超类(superclass)子类(subclass)Java仅支持单重继承,但可通过接口实现多重继承面向对象编程的特点继承(续)体现了对现实世界的抽象模拟提高了代码的复用性多态(polymorphism)用同一个名字调用实现不同操作的方法方式1:不同的类之间的同名方法 如:中国人/日本人/美国人说话方式2:参数不同的同名方法(如加法)使用方便,且降低了维护和编程量JAVA中的面向对象编程几个概念类:抽象的集合概念系统类库中已定义好的类用户自定义的类对象(实例instance):实际个体创建某个类的具体对象(类似变量声明)类名 欲创建的对象名=new类名(参数表);例如: Strings=newString(“Hello!”);继承、子类、父类JAVA中的面向对象编程Java中的类结构基类:所有JAVA的类都派生自ObjectJava的类可组织在包(package)中Java提供的标准类库分布在一系列的包中,如java.lang,java.util,等编程的过程就是继承基类或标准类而创建、定义特殊子类的过程类和对象对象

对象就是一组变量和相关方法的集合,其中变量表明对象的状态,方法表明对象所具有的行为。类 类是Java中的一种重要的复合数据类型,是组成Java程序的基本要素。它封装了一类对象的状态和方法,是这一类对象的原型。为什么使用类采用简单数据类型表示现实世界中概念的局限性; 例如:采用int型数据表示一个日期概念,需要使用3个变量:

int day,month,year;为什么使用类如果要表示2个人的生日,就要使用6个变量:

int

mybirthday,mybirthmonth,mybirthyear;

int

yourbirthday,yourbirthmonth,yourbirthyear;使用复合数据结构将具有相互关系的变量组合起来组成一个新的类型,用来表示一个完整的概念,这种新类型叫复合数据类型。classMyDate{ publicintday,month,year; }MyDate

mybirth,yourbirth;集成变量和方法类中不但有变量,还有与之相关的操作所定义的方法。将变量和方法封装在一个类中,可以对成员变量进行隐藏,外部对类成员的访问都通过方法进行,能够保护类成员不被非法修改。设计准则:将类中的成员变量设为private,而为每一个成员变量提供两个public方法:setMethod(args):void;getMethod():Classtype。其他类在设置或读取成员变量值要通过以上两个方法,而不能直接访问成员变量。集成变量和方法MyDatedate;已知当前日期对象,求第2天的日期对象date.day=date.day+1;//如果date.day已经为31,操作 //结果是非法状态定义一个成员方法tomorrow(),求第2天的日期对象外部要获得当前日期的后一天时,只要调用:

date.tomorrow()类声明格式:[public][abstract|final]classclassName[extendssuperclassName][implementsinterfaceNameList]{……..}类声明类修饰符:public:允许其他类(没有限制)访问本类,一个源文件仅可以有一个public类缺省:可被当前包中的其他类访问abstract:没有实例的抽象概念类final:不能再被扩展,不包含子类的类;易于安全性的实现,或用于创建固定功能的类父类继承声明:extends父类名实现接口(interface):implements接口名类体定义类体中定义了该类中所有的变量和该类所支持的方法classclassName{[public|protected|private][static][final][transient][volatile]typevariableName; //成员变量

[public|protected|private][static][final|abstract][native][synchronized]

returnType

methodName([paramList])[throws

exceptionList]{statements} //成员方法}成员变量成员变量的声明方式

[public|protected|private][static][final][transient][volatile] typevariableName; //成员变量成员变量的类型可以是Java中任意的数据类型,包括简单类型,类,接口,数组。在一个类中的成员变量应该是唯一的。成员变量声明成员变量〔member〕的语法

[修饰符]数据类型变量名;引用:对象名.变量,如修饰符访问控制符public:可被所有其他类引用private:仅可被该类自身引用和修改,不能被其他任何类(包括子类)引用成员变量protected:该类自身、子类、同一包中的其他类privateprotected:该类自身、子类缺省:本包中的类static:类成员变量,对所有的实例一致,引用时前缀可使用类名或对象名final:数值不变常量,定义同时应对其进行初始化final变量在Java语言中,可以利用关键字final将一个变量定义为常量标识符。finaldoublepi=3.1415926;变量pi的值在作用域范围内,只能被使用,不能被修改。final变量publicclassFinalVariable{privatestaticfinaldoublepi=3.1415926;publicstaticvoidmain(Stringarge[]){

System.out.println("pi="+pi);

System.out.println("area="+3*3*pi);}}变量的作用域在类体中声明的类成员变量,可在该类的各个成员方法中使用;在某个方法体中或参数表中声明的变量,只能在该方法体中使用;在某个语句块中声明的变量,只能在该语句块中使用。变量的作用域变量的作用域在Java语言中,嵌套的程序块的内层与外层,不允许定义相同的变量名,否则将导致编译错误。变量的作用域

publicclassScopeError{publicstaticvoidmain(Stringarge[]){int

E

=999;{int

E=999;

System.out.println("E="+E);}}}成员方法方法的实现包括两部分内容:方法声明和方法体

[public|protected|private][static][final|abstract][native][synchronized]

returnType

methodName([paramList])[throws

exceptionList] {statements} 成员方法定义对类内成员变量(数据)的操作方法的声明语法:

[修饰符]返回类型方法名(参数列表)

[throws例外名]{

方法体;

}方法的性质、接受哪些参数、如何返回信息成员方法修饰符(Modifier):访问控制符:public、private、protected、privateprotectedstatic:静态方法,又称类方法使用类名或对象名作为前缀,建议使用类名在方法体中只能使用static变量和static方法abstract:只有接口没有语句,要在子类中通过重新定义(override)来实现final:不能被重新定义(override)方法声明返回类型可以是任意的Java数据类型,当一个方法不需要返回值时,返回类型为void参数的类型可以是简单数据类型,也可以是引用数据类型(数组类型、类或接口),参数传递方式是值传递。方法声明throws:通告本方法中会产生的例外(异常)类型,提醒调用者要对相应的可能例外进行处理。当执行此方法并发生了例外时,程序会转入调用者编制的例外处理程序段。方法体方法体是对方法的实现。它包括局部变量的声明以及所有合法的Java指令。局部变量的作用域只在该方法内部设计原则类中的数据使用private定义使用public方法来操作数据把逻辑上相关联的数据封装成新的类来使用,类似结构体不要定义太庞大的类,要把无关的功能适当分离培养良好的编程风格类定义举例publicclassMyDate{ privateintday,month,year; publicvoidtomorrow(){ if(day<daysInMonth()){ day=day+1; } else…… } publicint

daysInMonth(){……} }方法重载(MethodOverloading)方法重载即指多个方法可以享有相同的名字。但是这些方法的参数必须不同,或者是参数个数不同,或者是参数类型不同方法重载(MethodOverloading)举例:

要打印不同类型的数据,int,float,String,不需要定义不同名的方法:printInt(int);printFloat(float);printString(String)

利用方法重载,只需要定义一个方法名:

println(),接收不同的参数:

println(int);

println(float);

println(String);构造函数Java试图在每个对象一诞生时,就给它一确定的状态,但有时这种系统的缺省初值不合适;所以在创建一个新对象时,需用构造函数完成合法的初始化,使类内成员的初始化工作不依赖于外界完成。构造函数构造函数是一种特殊的方法。Java中的每个类都有构造函数,用来初始化该类的一个新的对象。构造函数具有和类名相同的名称,而且不返回任何数据类型,在构造函数的实现中,也可以进行方法重载。构造函数构造函数只能在创建类对象时由系统隐含调用,而不能直接引用;类对象创建时,利用运算符new在内存中开辟专用空间,存放指定的类的实例(即对象),这时会自动执行类的构造函数,初始化新对象的成员变量。构造函数的继承子类没有定义构造函数时,自动继承父类不含参数的构造函数,并在创建新子类对象时自动执行子类有自己的构造函数时,创建新子类对象时也要先执行父类不含参数的构造函数,再执行自己的构造函数例:Sandwich.javaclassMeal{Meal(){……}}classBread{Bread(){……}}classCheese{Cheese(){……}}classLettuce{Lettuce(){……}}classLunchextendsMeal{Lunch(){……}}classPortableLunchextendsLunch{

PortableLunch(){……}}classSandwichextendsPortableLunch{Breadb=newBread();Cheesec=newCheese();Lettucel=newLettuce();Sandwich(){…...}publicstaticvoidmain(String[]args){newSandwich();}}///:~构造函数的继承注意构造函数的调用顺序:按继承顺序依次调用父类的不含参数的构造函数,直到到达本子类依次执行本子类成员对象的构造函数最后,执行本子类的构造函数例:在生成sandwich对象时构造函数的调用顺序为:Meal()->Lunch()->PortableLunch()->Bread()

->Cheese()->Lettuce()->Sandwich()构造函数的继承子类的构造函数定义中,如要调用父类的含参数的构造函数,需用super关键字,且该调用语句必须是子类构造函数的第一个可执行语句。一构造函数可利用this调用本类其他的构造函数,此时this应是第一个可执行语句构造函数publicclassEmployee{ privateStringname; privateintsalary; publicEmployee(Stringn,ints){ name=n; salary=s; } publicEmployee(Stringn){

this(n,0); }构造函数 publicEmployee(){

this(“Unknown”); }}

对象对象的生成 通过new操作符生成一个对象; 例如:

MyDatedate; date=newMyDate();对象的构造过程为对象开辟空间,并对对象的成员变量进行缺省的初始化;对成员变量进行指定的初始化;静态数据成员、复杂数据成员的初始化可在静态初始化器中完成;静态初始化器中的语句在类加载内存时执行,这种初始化操作要比构造函数执行得更早;调用构造函数。对象的使用对象的使用通过一个引用类型的变量来实现,包括引用对象的成员变量和方法,通过运算符‘·’可以实现对变量的访问和方法的调用。 例如:

MyDatedate=newMyDate(); date.day //引用date的成员变量day date.tomorrow() //调用date的方法tomorrow()对象的构造过程举例MyDatemy_birth=newMyDate(22,7,1964);MyDatemy_birth

=newMyDate(22,7,1964);为引用变量开辟空间对象的构造过程举例MyDatemy_birth=newMyDate(22,7,1964);使用‘new’操作符为MyDate类型的对象开辟空间对象的构造过程举例初始化类定义时指定的变量值对象的构造过程举例MyDatemy_birth=newMyDate(22,7,1964);执行构造函数对象的构造过程举例MyDate

my_birth=newMyDate(22,7,1964);用新生成的对象给引用变量赋值变量的赋值

intx=7;

inty=x;

MyDates=newMyDate(22,7,1964);

MyDatet=s;变量的赋值t=newMyDate(22,12,1964);一个小问题对于类Rock:

RockR1=newRock(1); RockR2=R1;这时,内存中为Rock类创建了几个实例呢?如果只有一个实例,那么这个实例有几个引用(reference)呢?包(Package)由于Java编译器为每个类生成一个字节码文件,且文件名与类名相同,因此同名的类有可能发生冲突。为了解决这一问题,Java提供包来管理类名空间。包是若干CLASS的松散组合,这些CLASS之间不需要有明确、密切的关系,如继承等,但一般它们共同工作,可互相访问彼此的成员。Java用包来组织CLASS,从而提高了类的可重用性。package语句package语句作为Java源文件的第一条语句,指明该文件中定义的类所在的包。(若缺省该语句,则指定为无名包)。它的格式为:

packagepkg1[.pkg2[.pkg3…]];Java编译器把包对应于文件系统的目录管理,package语句中,用‘

.’

来指明目录的层次;

编译和生成包如果在程序Test.java中已定义了包p1,编译时采用如下方式:javac-ddestpathTest.java

则编译器会自动在destpath目录下建立一个子目录p1,并将生成的.class文件都放到destpath/p1下。import语句为了能使用Java中已提供的类,我们需要用import语句来引入所需要的类。

importpackage1[.package2…].(classname|*);例如:

importjava.awt.*; importjava.io.*;

javac编译器编译源程序时,如果遇到当前包中没有定义的类,就会以环境变量classpath为相对查找路径,按照包名的结构来查找引用的外部类。import语句对于importjava.io.*;

将按照路径:classpath\java\io\来查找所需的外部类。环境变量classpath是用来指示Java程序所引用的外部类所在的一系列相对路径的一个环境变量。信息隐藏对类的成员施以一定的访问权限限定,实现类中成员在一定范围内的信息隐藏 同一个类中同一个包中

不同包中的子类不同包中的非子类

private ★ default ★ ★ protected ★ ★

★ public ★★ ★ ★ 继承性继承性是面向对象程序设计语言的另一基本特征,通过继承可以实现代码的复用。继承而得到的类为子类,被继承的类为父类,父类包括所有直接或间接被继承的类。Java中不支持多重继承。创建子类通过在类的声明中加入extends子句来创建一个类的子类:

classSubClassextendsSuperClass

{ ……}如果缺省extends子句,则该类为java.lang.Object的子类。子类可以继承父类中访问权限设定为public、protected、default的成员变量和方法。但是不能继承访问权限为private的成员变量和方法。成员变量的隐藏和方法的重写classSuperClass{

intx; ……

voidsetX(){ x=0; } ……}成员变量的隐藏和方法的重写classSubClassextendsSuperClass{

intx; //hidexinSuperClass ……

voidsetX(){//overridemethodsetX()inSuperClass x=5; } …… }引用父类成员Java中通过super来实现对父类成员的访问。

1.用来访问父类被隐藏的成员变量,如:super.variable 2.用来调用父类中被重写的方法,如:super.Method([paramlist]);

3.用来调用父类的构造函数,如:super([paramlist]);多态性多态性是指在程序中需要使用父类对象的地方,都可以用子类对象来代替。

例如:

publicclassEmployeeextendsObject{……} publicclassManagerextendsEmployee{……}

则:

Employeee=newManager();//合法语句

重写方法的调用对于重写的方法,Java运行时系统根据调用该方法的实例的类型来决定选择哪个方法调用。

classA{voidcallme(){

System.out.println("InsideA'scallme()method"); } }重写方法的调用classBextendsA{ voidcallme(){

System.out.println("InsideB'scallme()method"); }}publicclassDispatch{ publicstaticvoidmain(Stringargs[]){ Aa=newB();

a.callme(); }}重写方法的调用运行结果为:InsideB'scallme()method方法重写时应遵循的原则改写后的方法不能比被重写的方法有更严格的访问权限改写后的方法不能比被重写的方法产生更多的例外多态与重载举例例:Shapes.java三个类Circle、Square、Triangle均有draw()方法和erase()方法,但不同类的方法的具体操作其实并不相同,实现了多态。draw()erase()draw()erase()draw()erase()对象状态的确定在Java语言中,提供了操作符instanceof用来判断对象是否属于某个类的实例。

publicvoidmethod(Employeee){if(einstanceofManager){…//dosomethingasaManager}elseif(einstanceofContractor){ …}//dosomethingasaContractorelse{ …//dosomethingelse} }final关键字final修饰变量,变量就变成了常量;final修饰方法,方法就不能再重写;final修饰类,类就不能再继承。实例成员和类成员用static关键词修饰的成员,叫类成员(静态成员)。实例变量和类变量

以static修饰的成员变量,叫类变量;否则,叫实例变量。实例方法和类方法

以static修饰的成员方法,叫类方法;否则,叫实例方法。类方法只允许调用类方法,而不可以调用实例方法;实例方法却可以调用类方法或其他的实例方法。类变量类变量的生存期不依赖于对象,相当于C语言中全局变量的作用。

publicclassCount{ privateint

serialNumber; privatestaticintcounter=0; publicCount(){ counter++;

serialNumber=conter; } }类变量的使用

publicclassStaticVar{ publicstaticintnumber; } publicclassOtherClass{ publicvoidmethod(){

intx=StaticVar.number; } }类方法的使用

publicclassGeneralFunction{ publicstaticint

addUp(int

x,inty){ returnx+y; } publicclassUseGeneral{ publicvoidmethod(){

inta=9;

intb=10;

intc=GeneralFunction.addUp(a,b); } }实例变量的使用

publicclassWrong{

intx; publicstaticvoidmain(Stringargs[]){ x=9; //compilererror } }抽象类(abstractclass)用abstract关键字来修饰一个类时,这个类叫做抽象类;用abstract来修饰一个方法时,该方法叫做抽象方法。abstract类必须被继承,abstract方法必须被重写。抽象类不能被实例化。抽象方法只需声明,而不需实现。

abstractreturnType

abstractMethod([paramlist]);abstractclassA{ abstractvoidcallme(); voidmetoo(){

System.out.println("InsideA'smetoo()method"); }}classBextendsA{ voidcallme(){

System.out.println("InsideB'scallme()method"); }}publicclassAbstract{ publicstaticvoidmain(Stringargs[]){ Ac=newB();

c.callme();

c.metoo(); }}

运行结果为:InsideB'scallme()methodInsideA'smetoo()method接口(interface)接口就是方法定义和常量值的集合。从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现。接口的作用通过接口可以实现不相关类的相同行为,而不需要考虑这些类之间的层次关系。通过接口可以指明多个类需要实现的方法。通过接口可以了解对象的交互界面,而不需了解对象所对应的类。接口的定义[public]

温馨提示

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

评论

0/150

提交评论