版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第三章面向对象编程第1页,课件共63页,创作于2023年2月本章知识要点:定义继承、多态、重载、覆盖和虚拟方法调用使用访问修饰符protected和“友元包”描述构造器和方法重载的概念描述完整的对象构造和初始化操作在java程序中识别下列内容重载方法和构造器使用this来调用重载的构造器覆盖方法调用超类方法父类构造器调用父类构造器类设计第2页,课件共63页,创作于2023年2月面向对象的思想概述面向对象的编程思想力图使对计算机语言中对事物的的描述与现实世界中该事物的本来面目尽可能的一致。类(class)和对象(object)是面向对象方法的核心概念。类是对一类事物描述,是抽象的、概念上的定义;对象是实际存在的该类事物的每个个体,因而也称实例(instance)。第3页,课件共63页,创作于2023年2月类和对象(1)对象表示现实世界中某个具体的事物。抽象是从特定的实例中抽取共同的性质以形成一般化概念的过程。对象具有两方面的含义:在现实世界中:是客观世界中的一个实体在计算机世界中:是一个可标识的存储区域第4页,课件共63页,创作于2023年2月类和对象(2)类是具有共同属性和行为的对象的抽象。类可以定义为数据和方法的集合。类也称为模板,因为它们提供了对象的基本框架。类对象抽象实例化属性或状态操作或行为数据或变量方法封装的实体=数据+方法第5页,课件共63页,创作于2023年2月创建类classname{typevariable1;…typevariableN;
typemethodname1(parameter-list){//方法体}…typemethodnameN(parameter-list){//方法体}}
在类中,属性是通过成员变量体现的,而操作是用成员函数(又称为方法)实现的。Java中定义类的通用格式:成员变量(对象属性)成员方法(对象行为或操作)第6页,课件共63页,创作于2023年2月类和对象举例定义一个类:
classPerson{
intage;
intgetAge(){ returnage; }
voidsetAge(inti){ age=i; } }声明并创建一个Person类的对象,将该对象命名为a:
Persona=newPerson();调用对象a中的方法:
a.setAge(36);第7页,课件共63页,创作于2023年2月声明属性语法格式:[<modifiers>]type<attr_name>[=defaultValue];举例:
publicclassPerson{
privateintage;
publicStringname=“Lila”;}第8页,课件共63页,创作于2023年2月定义方法定义方法的一般格式:[access]typemethodname1([parameter-list]){//方法体}发往某个对象的消息对应于一个方法调用。作为对消息的响应,对象将执行一个类似于过程体的方法。方法是包含在类中的函数。方法名称返回类型修饰符,可选参数列表,可选举例:publicvoidsetdate(intday,intmonth,intyear){day=23;month=7;year=2003;}第9页,课件共63页,创作于2023年2月构造方法构造函数名称与类名称相同构造函数没有返回类型其任务是在创建对象时初始化其内部状态classFruit{booleanseedLess;booleanseasonal;floatprice;
Fruit(booleanseed,booleanseason,floatp){
seedLess=seed; seasonal=season; price=p; }
}第10页,课件共63页,创作于2023年2月默认的构造方法(1)Java语言中,每个类都至少有一个构造方法;如果类的定义者没有显式的定义任何构造方法,系统将自动提供一个默认的构造方法:默认构造方法没有参数默认构造方法没有方法体Java类中,一旦类的定义者显式定义了一个或多个构造方法,系统将不再提供默认的构造方法;第11页,课件共63页,创作于2023年2月默认的构造方法(2)类的定义:publicclassPerson{
privateintage;
publicvoidsetAge(intw){age=w;} }等价于:
publicclassPerson{
privateintage
publicPerson(){}
publicvoidsetAge(intw){age=w;} }应用举例:publicclassTest{
publicstaticvoidmain(Stringargs[]){Persond=newPerson();d.setAge(120);}}第12页,课件共63页,创作于2023年2月创建对象使用下列语法可创建对象:
new构造函数关键字new通常称为创建运算符,用于分配对象内存,并将该内存初始化为缺省值。一旦new完成分配和初始化内存,它就将调用构造函数来执行对象初始化。
当创建一个类时,只是创建了一种新的数据类型。对象是类的一个实例。classFruitDemo{publicstaticvoidmain(Stringargs[]){ Fruitf=newFruit(true,false,50.0F);}}
创建对象第13页,课件共63页,创作于2023年2月练习分析并编译、运行下面的源文件,体会类的定义、对象的创建、对象成员方法的调用、类的定义和应用程序在源文件结构上的不同;
//源文件A.javapublicclassA{publicvoidm1(){System.out.println("hi");}}
//源文件Test.javapublicclassTest{ publicstaticvoidmain(String[]args){ Ahello=newA(); hello.m1(); }}第14页,课件共63页,创作于2023年2月面向对象的应用举例(1)程序BirthDate.java:publicclass
BirthDate{
privateintday;
privateintmonth;
publicintyear;
publicvoidsetDay(intd){day=d;}
publicvoidsetMonth(intm){month=m;}
publicvoidsetYear(inty){year=y;}
publicintgetDay(){returnday;}
publicintgetMonth(){returnmonth;}
publicintgetYear(){returnyear;}
publicvoidshow(){ System.out.println(day+"-"+month+"-"+year); }}第15页,课件共63页,创作于2023年2月面向对象的应用举例(2)程序ObjectOperating.java: publicclassObjectOperating{
publicstaticvoidmain(Stringargs[]){ BirthDateb=newBirthDate(); b.setDay(25); b.setMonth(12); b.setYear(2003);b.day=2; b.year=2003; b.show(); } }
第16页,课件共63页,创作于2023年2月Java中的访问修饰符Java中共有四种访问修饰符:1、public:完全公开,没有类或包的限制2、protected:强调继承关系,没有包的限制3、default:有包的限制,没有类的限制,对于同一包中的类来说,相当于public修饰符。也可叫做packageprivate4、private:有包的限制,同时也有类的限制,只能被同一个类中的成员函数或内部类访问。第17页,课件共63页,创作于2023年2月关于访问权限的习题测试privatefriendlyprotectedpublic同一类同包不同类同包子类不同包子类不同包不同类calssuseYYYYNYYYNYYYNNYYNNNY下题每空5分,测测您的分数:第18页,课件共63页,创作于2023年2月实例验证……在同一个类中packageaccessdemo;publicclassSuperClass{publicvoidtestPublic(){System.out.println("apublicmethodinsuperclass");}protectedvoidtestProtected(){System.out.println("aprotectedmethodinsuperclass");}voidtestFriendly(){System.out.println("afriendlymethodinsuperclass");}privatevoidtestPrivate(){System.out.println("aprivatemethodinsuperclass");}publicstaticvoidmain(Stringargs[]){ SuperClasssc=newSuperClass(); sc.testPublic(); sc.testProtected(); sc.testFriendly(); sc.testPrivate(); } }第19页,课件共63页,创作于2023年2月实例验证……同一包不同类packageaccessdemo;importaccessdemo.SuperClass;publicclassSamePackOtherClass{publicstaticvoidmain(Stringargs[]){ SuperClasss=newSuperClass(); s.testPublic(); s.testProtected(); s.testFriendly();
s.testPrivate(); } }s.testPrivate();第20页,课件共63页,创作于2023年2月实例验证……同一包子类packageaccessdemo;importaccessdemo.SuperClass;publicclassSamePackSubClassextendsSuperClass{publicstaticvoidmain(Stringargs[]) {SamePackSubClasss1=newSamePackSubClass();s1.testPublic();s1.testProtected();s1.testFriendly();s1.testPrivate();
}}s1.testPrivate();第21页,课件共63页,创作于2023年2月实例验证……不同包子类packageaccessdemo.otherpack;importaccessdemo.SuperClass;publicclassOtherPackSubClassextendsSuperClass{publicstaticvoidmain(Stringargs[]){OtherPackSubClasss1=newOtherPackSubClass();s1.testPublic();s1.testProtected();s1.testFriendly();s1.testPrivate();} }s1.testFriendly();s1.testPrivate();第22页,课件共63页,创作于2023年2月实例验证……不同包不同类packageaccessdemo.otherpack;importaccessdemo.SuperClass;publicclassOtherPackOtherClass{publicstaticvoidmain(Stringargs[]){ SuperClasss=newSuperClass(); s.testPublic(); s.testProtected(); s.testFriendly(); s.testPrivate(); } } s.testProtected(); s.testFriendly(); s.testPrivate();第23页,课件共63页,创作于2023年2月继承继承表示一个类从其它类中获得结构和行为(子类/父类)又名普遍化交通工具是一个父类地面交通工具和空中交通工具是子类VehicleGroundVehicleAirVehicleThearrowpointstowardthesuperclass第24页,课件共63页,创作于2023年2月继承继承通常被称为“is-a”或“kind-of”一个子类的实例也“isa”父类的实例一个子类的实例是“kind-of”父类第25页,课件共63页,创作于2023年2月多层次ACarisakindofGroundVehiclewhichisakindofVehicleVehicleandAirVehicleareancestorsofAirplaneAirVehicleandAirplanearedescendantsofVehicleVehicleGroundVehicleAirVehicleCarTruckAirplaneHelicopter第26页,课件共63页,创作于2023年2月继承操作属性在继承结构的最高一层定义所有子类的实例能够继承这些操作每个子类可以增加或重新定义继承的属性GroundVehiclelicenseNumberweightregister()CarTrucktonnagecalculateTax()Atruckhasthreeattributes:licenseNumberweighttonnageandtwooperations:registercalculateTax第27页,课件共63页,创作于2023年2月继承关系
关系也可以继承每个子类都可以分享继承的关系GroundVehiclelicenseNumberweightregister()AtruckhasanownerCarTrucktonnagecalculateTax()OwnerPerson1..*andacarhasanowner1owner第28页,课件共63页,创作于2023年2月覆盖方法
子类可以修改从父类继承的行为。子类可以创建同父类的方法不同功能的方法,但方法名、返回值类型、参数列表必须一致。要求:
1.方法声明形式一致
2.方法权限不允许缩小
3.覆盖的方法不允许抛出比父类方法更多的异常第29页,课件共63页,创作于2023年2月方法覆盖的示例classA1{voidcallme(){System.out.println(“在A1的callme()成员函数里”);}}classB1extendsA1{voidcallme(){System.out.println(“在B1的callme()成员函数里”);}}publicclassDispatch{publicstaticvoidmain(Stringargs[]){A1a=newA1();a.callme();A1b=newB1();b.callme();}}示例II:6-10练习第30页,课件共63页,创作于2023年2月Super关键字
super关键字引用使用该关键字的类的超类。它用于引用超类的成员变量和方法。 1).点取父类中被子类隐藏了的数据成员
2).点取已经覆盖了的方法 3).作为方法名表示父类构造方法 注:在创建子类对象时,缺省沿继承链调用所有父类无参的构造方法,也可以用super关键字来显示调用直接父类的构造方法
第31页,课件共63页,创作于2023年2月使用super关键字-示例classA{ publicinti;
publicA() { }
publicA(inti){this.i=i; }
intget(){ returni; }}classBextendsA{ publicB() { super(3); } publicstaticvoidmain(Stringargs[]) { Bb=newB(); intx=b.get();System.out.println(“所得值为:"+x); }}
示例II:6-12练习第32页,课件共63页,创作于2023年2月执行结果第33页,课件共63页,创作于2023年2月多态1、方法的重载(overload)2、方法的覆盖(override)3、一个引用变量可以指向多个不同形式的对象第34页,课件共63页,创作于2023年2月成员方法的重载方法的重载:
就是在一个类的定义中有多个名称相同的成员方法,每个方法的参数列表必须不同。返回值类型可以不同。
方法的重载如下例所示:
voidgetArea(intw,inth);voidgetArea(floatw,floath);程序实例见备注。第35页,课件共63页,创作于2023年2月成员方法重载实例classTest{public
intmax(inta,intb){returna>b?a:b;}publicdoublemax(doublea,doubleb){returna>b?a:b;}publicStringmax(Stringa,Stringb){returna.length()>b.length()?a:b);}publicstaticvoidmain(Strings[]){Aa=newA();a.max(5,6);a.max(4.5,6.7);a.max(“abc”,“def”);}}第36页,课件共63页,创作于2023年2月构造器重载classperson{Stringname=“neusoft";intage=45;person(){}person(Stringa){name=a;}person(Stringa,intb){name=a; age=b;}publicvoiddisplay(){System.out.println("Name="+name+","+"Age="+age);}}publicclassOverloadedDemo{publicstaticvoidmain(Stringargs[]){persond1=newperson();persond2=newperson("zhou");persond3=newperson("zhou",27);d1.display();d2.display();d3.display(); }}
第37页,课件共63页,创作于2023年2月重载时使用this关键字classA{inti=0,j=0;publicA(inti,intj){this.i=i;this.j=j;}publicA(intk){this(k,k);}publicstaticvoidmain(Strings[]){Aa1=newA(3,5);Aa2=newA(8);……}}表示方法名时,只能出现在构造方法里,且为第一句第38页,课件共63页,创作于2023年2月父类构造器的调用控制classBeeextendsQueen{inta;Bee(inta){this.a=a;}Bee(){this(12);}}classQueen{inta;Queen(inta){this.a=a;}}classBeeextendsQueen{intb;Bee(intb){super(15);this.b=b;}}第39页,课件共63页,创作于2023年2月调用构造器的相关规则从一个类创建对象时,可以调用此类的父类的构造器。调用方法为在类的构造器的方法体中的第一条语句使用super。如果一个类的构造器中的第一条语句没有用super来调用其父类的构造器,编译器将在构造器中使用super调用父类的不带参数的构造器。但如果父类中所有的构造器都是必须带参数的,将会产生错误。如果某个类的构造器的第一条语句使用了this来调用本类的另一个构造器,则Java系统就不会默认此构造器需要调用父类的构造器了。一个构造器用this调用本类的另一个构造器时,如果被调用的构造器又是调用父类的构造器而又没有用super,此时,Java编译器将会默认它含有super语句。如父类中没有不带参数的构造器,编译将出错。第40页,课件共63页,创作于2023年2月方法的覆盖
子类可以修改从父类继承的行为。子类可以创建同父类的方法不同功能的方法,但方法名、返回值类型、参数列表必须一致。要求:
1.方法声明形式一致
2.方法权限不允许缩小
3.覆盖的方法不允许抛出比父类方法更多的异常第41页,课件共63页,创作于2023年2月Instanceof操作符一个引用变量可以指向多个不同形式的对象第42页,课件共63页,创作于2023年2月final和abstract关键字理解关键字的意义举例(略)第43页,课件共63页,创作于2023年2月接口接口就是一种标准!第44页,课件共63页,创作于2023年2月接口的特点接口使用interface关键字定义接口中定义的变量都是最终的静态变量publicstaticfinal
inta;接口没有自己的构造函数,它所定义的方法均是抽象方法
publicabstract
speak();Java中类采用单一继承的机制,接口则采用多重继承的机制。Java通过接口实现了多重继承的功能。第45页,课件共63页,创作于2023年2月接口的多重实现第46页,课件共63页,创作于2023年2月接口的应用实例(一)第47页,课件共63页,创作于2023年2月多重接口的应用实例第48页,课件共63页,创作于2023年2月关于接口的注意事项1、如果一个类实现了一个接口,则该类必须实现该接口的所有方法。2、如果一个类实现了一个继承其它接口的接口,则该类必须实现这个接口和其父接口的所有方法。3、接口不是类,不能使用new操作符来实例化。但可以声明一个接口变量。例如:
MyInterfacex;//正确
MyInterfacex=newMyInterface();//错误4、一个接口变量必须指向一个实现了该接口的类的对象。第49页,课件共63页,创作于2023年2月接口与抽象类的区别接口:拥有的成员函数均为抽象函数,支持多重继承。抽象类:拥有能够具体实现功能的成员函数,支持单继承。区别第50页,课件共63页,创作于2023年2月接口练习题Giventhefolowingclasseswhichofthefollowingwillcompilewithouterror?interfaceIFace{}classCFaceimplementsIFace{}classBase{}publicclassObRefextendsBase{publicstaticvoidmain(Stringargv[]){ObRefob=newObRef();Baseb=newBase();Objecto1=newObject();IFaceo2=newCFace();}}1)o1=o2;2)b=ob;3)ob=b;4)o1=b;第51页,课件共63页,创作于2023年2月嵌套类(内部类)内部类:就是将类定义放在其他类的定义中!内部类的优势:1、对于同一个包中的其它类来说,内部类可以隐藏起来(使用private关键字)。2、实现C++中友元类的功能。内部类可以访问其所在的外部类的变量和方法。注意:1、如想实例化一个内部类,需这样使用内部类类名:外部类类名.内部类类名2、如内部类有和外部类同名的变量和方法,则内部类的变量和方法将获得比外部类的变量和方法高的优先级。第52页,课件共63页,创作于2023年2月内部类(InnerClass)内部类是一个定义在另一个类内部的类,例如: classOuterClass {
staticclassA{}//静态内部类 classB{}//非静态内部类publicvoiddisp(){classC{}//局部内部类}}编译后:OuterClass.class OuterClass$A.class OutClass$B.class OuterClass$1$C.class第53页,课件共63页,创作于2023年2月内部类使用示例classOuterClass{staticclassA//静态内部类{publicA(){System.out.println("Test$A!");}}classB//非静态内部类{publicB(){System.out.println("Test$B!");}}publicvoiddisp(){finalinta=10;intb;
classC//成员函数中的局部内部类 {publicC() {System.out.println(“inclassCa="+a);
//System.out.println(b);
} }
Cc=newC(); } }第54页,课件共63页,创作于2023年2月内部类的使用示例(续)publicclassTestextendsOuterClass{publicstaticvoidmain(Stringargs[]){OuterClass.Aa=newOuterClass.A();Bb=newOuterClass().newB();OuterClasst=newOuterClass();
t.disp(); }}第55页,课件共63页,创作于2023年2月运行结果第56页,课件共63页,创作于2023年2月嵌套类特性嵌套类名必须充分有效。定义在方法中的嵌套类称为局部类。局部类可以访问final的局部变量。嵌套类可以是抽象类。接口可以嵌套,即可以存在内部接口,一般被内部类实现。嵌套类可以访问所在域的静态成员。非局部类可以有任意的访问保护。嵌套类及其所在的类被同时编译。使用内部类可以方便的编写事件驱动程序。第57页,课件共63页,创作于2023年2月package语句(1)为便于管理大型软件系统中数目众
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026协调和组织面试题及答案
- 2026学校副校长面试题及答案
- 2026医防融合面试题及答案
- 2026银行营销面试题及答案
- 定点医疗机构医保管理制度
- 2026中国洗衣粉包装创新趋势与消费者吸引力提升研究
- 康复医学科管理制度汇编
- 2026中国食品加工设备制造业市场现状调研与行业产业发展方向报告
- 2026汽车尾气污染治理技术升级与环保法规实施效果分析
- 2026全球与中国书法研究行业市场发展分析及发展前景预测研究报告
- (正式版)DB3401∕T 312-2023 《城市生命线工程安全运行监测风险预警响应》
- 2026年职业卫生知识培训考试重点题库(350题)
- 2026年广西(高考)历史真题试卷(含答案)
- 2026年浙江省海宁市高一数学下册期末考试模拟测试卷附参考答案(完整版)
- 2026年保安证考试重点及试题附答案
- 2026年G3锅炉水处理证考试题库及答案
- 护理不良事件的培训内容
- 研究生导师培训心得体会
- 2026年护理招聘三基试题及答案
- 2026年中国地质科学院矿产资源研究所招聘笔试参考题库附带答案详解
- 2025衡水学院教师招聘考试题目及答案
评论
0/150
提交评论