Java面向对象程序设计.ppt

上传人:tia****nde 文档编号:12707048 上传时间:2020-05-14 格式:PPT 页数:85 大小:2.99MB
返回 下载 相关 举报
Java面向对象程序设计.ppt_第1页
第1页 / 共85页
Java面向对象程序设计.ppt_第2页
第2页 / 共85页
Java面向对象程序设计.ppt_第3页
第3页 / 共85页
点击查看更多>>
资源描述
第三章Java面向对象程序设计,面向对象概述,3.1,类与对象,3.2,成员变量和成员方法,3.3,继承与多态,3.4,包、接口与内部类,3.5,万物皆对象,世界是由什么组成的?,身边的对象,布兰尼,朱丽叶,顾客姓名:朱丽叶年龄:28体重:52千克操作:购买商品,姓名:布兰尼职衔:收银员年龄:35体重:60千克操作:收款打印账单,对象的特征属性,属性对象具有的各种特征每个对象的每个属性都拥有特定值例如:布兰尼和朱丽叶的体重不一样,60kg,布兰尼,属性,35岁,对象的特征方法,方法对象执行的操作,打单,收银,方法,刷卡,对象的属性和方法,列出尼古拉斯凯奇驾驶的这辆法拉利F360Spider的属性和方法列出小狗对象的属性和方法,属性:品牌:法拉利型号:F360Spider颜色:黄色价格:380万元方法:发动停止加速,属性:颜色:白色方法:叫跑吃,小结1,说一说教室里的对象描述他们的属性和方法,颜色:黑色品牌:BENQ投影,姓名:张三年龄:20学习,类型:白炽灯开关变亮变暗,材制:木质支撑物品,封装,对象同时具有属性和方法两项特性对象的属性和方法通常被封装在一起,共同体现事物的特性,二者相辅相承,不能分割,谁看见过只有“完好的零件和颜色”而不能开动的汽车?,从对象抽象出“类”,抽取出下列对象的属性和方法的共同特征,轿车,顾客,类,顾客类轿车类,类是模子,确定对象将会拥有的特征(属性)和行为(方法),类是对象的类型不同于int类型:具有方法,各种口味的球状冰淇淋,球状冰淇淋模子,小结2,类和对象有什么区别呢?类是抽象的概念,仅仅是模板,比如说:“人”对象是一个你能够看得到、摸得着的具体实体,比如:“小布什”,小布什,普京,克林顿,Java是面向对象的语言,所有Java程序都以类class为组织单元关键字class定义自定义的数据类型,publicclassHellopublicstaticvoidmain(Stringargs)System.out.println(使用Java语言理解程序逻辑);,Java类模板,类将现实世界中的概念模拟到计算机程序中,publicclass类名/定义属性部分属性1的类型属性1;属性2的类型属性2;属性n的类型属性n;/定义方法部分方法1;方法2;方法m;,定义类,定义一个类的步骤1、定义类名2、编写类的属性3、编写类的方法,类示例2-1,用类的思想输出计算机培训中心信息,类示例2-2,publicclassAccpSchool/定义培训中心的属性StringschoolName;/中心的全称intclassNum;/教室的数目intlabNum;/机房的数目/定义培训中心的方法publicStringtoString()returnschoolName+培训ACCP学员+n+配备:+classNum+教+labNum+机;,定义类的toString()方法,用于输出类相关的信息,publicStringtoString()return字符串;/方法体,成员变量,常见错误,publicclass.BookStringbookName;StringauthorName;intpageNum;booleanisAvailable;,类命名规则:1、不能使用Java关键字2、首字母可以为字母,也可以是“_”或“$”(建议不要这样)3、不能包含空格或“.”号,代码错误,如何创建和使用对象,使用对象的步骤:使用new创建类的一个对象使用对象:使用“.”进行以下操作给类的属性赋值:对象名.属性调用类的方法:对象名.方法名(),AccpSchoolcenter=newAccpSchool();,center.schoolName=北京中心;/给属性赋值center.toString();/调用类的方法,该方法中的操作将被执行,publicclassInitialAccpSchoolpublicstaticvoidmain(Stringargs)AccpSchoolcenter=newAccpSchool();System.out.println(center);center.schoolName=北京中心;center.classNum=10;center.labNum=10;System.out.println(center);,创建和使用对象示例,创建“北京中心”对象,说一说看到什么效果?,调用类的toString()方法是特例:这里使用center.toString()和center作用相同更简便,综合案例,编写学生类,输出学生相关信息编写教员类,输出教员相关信息,小结3,编写一个手机类,并编写测试类显示手机信息,为什么需要封装2-1,编写一个类,代表教员,要求:具有属性:姓名、年龄具有行为:自我介绍教师的最小年龄要求:22岁,publicclassTeacher1publicStringname;/教员姓名publicintage;/年龄/*返回自我介绍的内容*/publicStringintroduction()return大家好!我是+name+,我今年+age+岁;,为什么需要封装2-2,编写一个测试类,要求:实例化一个教员对象,并对其初始化在控制台输出该教员的自我介绍,publicclassTeacher1Testpublicstaticvoidmain(Stringargs)Teacher1teacher=newTeacher1();teacher.name=李芳;teacher.age=10;System.out.println(teacher.introduction();,要满足教员的最小年龄要求,可以通过对属性的封装来实现,什么是封装,publicclassTeacher2privateStringname;/教员姓名/返回教员姓名publicStringgetName()returnname;/设定教员姓名publicvoidsetName(Stringname)this.name=name;,封装,就是隐藏实现细节将属性私有化,提供公有方法访问私有属性通过这些公有方法访问私有属性,Teacher2teacher=newTeacher2();teacher.setName(李芳);StringtName=teacher.getName();,通过setter、getter方法访问name属性,this代表当前类的实例,如何实现封装2-1,封装的实现:1、修改属性的可见性来限制对属性的访问2、为每个属性创建一对赋值(setter)方法和取值(getter)方法,用于对这些属性的访问3、在setter和getter方法中,加入对属性的存取限制,publicclassTeacher3privateStringname;/教员姓名privateintage;/年龄publicintgetAge()returnage;publicvoidsetAge(intage)if(age22)System.out.println(错误!最小年龄应为22岁!);this.age=22;/如果不符合年龄要求,则赋予默认值elsethis.age=age;/此处省略对name属性的setter、getter方法,1,2,3,如何实现封装2-2,publicclassTeacher3Testpublicstaticvoidmain(Stringargs)Teacher3teacher=newTeacher3();teacher.setName(李芳);teacher.setAge(10);System.out.println(teacher.introduction();,使用封装,增加了数据访问限制,增强了程序的可维护性,错误!最小年龄应为22岁!大家好!我是李芳,我今年22岁,测试类通过调用setter方法,为对象的各个属性赋值,小结4,使用private关键字修饰某个成员变量后,这个成员变量可以被同一包中的其它类访问吗?在Java程序中,代码封装带给我们的好处是什么?,小结5,请通过代码封装,实现如下需求:编写一个类Book,代表教材:具有属性:名称(title)、页数(pageNum),其中页数不能少于200页,否则输出错误信息,并赋予默认值200为各属性设置赋值和取值方法具有方法:detail,用来在控制台输出每本教材的名称和页数编写测试类BookTest进行测试:为Book对象的属性赋予初始值,并调用Book对象的detail方法,看看输出是否正确,为什么需要构造方法2-1,开发教员类Teacher4,要求:具有属性:姓名、年龄、学历、职位具有行为:自我介绍,publicclassTeacher4privateStringname;/姓名privateintage;/年龄privateStringeducation;/学历privateStringposition;/职位publicStringintroduction()return大家好!我是+name+,我今年”+age+岁,学历“+education+,目前职位是+position;publicStringgetName()returnname;publicvoidsetName(StringmyName)name=myName;/以下是其他属性的setter、getter方法,此处省略,为什么需要构造方法2-2,编写一个测试类,要求:实例化一个教员对象,并对其初始化在控制台输出该教员的自我介绍,publicclassTeacher4Testpublicstaticvoidmain(Stringargs)Teacher4teacher=newTeacher4();teacher.setName(李芳);teacher.setAge(23);teacher.setEducation(本科);System.out.println(teacher.introduction();,要简化对象初始化的代码,可以通过构造方法来解决,大家好!我是李芳,我今年23岁,学历本科,目前职位是null,AccpTeacher4中有太多的属性及对应的setter方法,在初始化时,很容易就忘记了,有没有可能简化对象初始化的代码?,什么是构造方法,构造方法负责对象成员的初始化工作,为实例变量赋予合适的初始值构造方法必须满足以下语法规则:1、方法名与类名相同2、没有返回类型,publicclassTeacher5privateStringname;/教员姓名/构造方法publicTeacher5()name=无名氏;,publicclassTeacher5Testpublicstaticvoidmain(Stringargs)Teacher5teacher=newTeacher5();,使用new关键字调用构造方法,带参数的构造方法2-1,通过带参数的构造方法,显式地为实例变量赋予初始值,publicclassTeacher6privateStringname;/教员姓名privateintage;/年龄privateStringeducation;/学历privateStringposition;/职位/带参数的构造方法publicTeacher6(StringpName,intpAge,StringpEducation,StringpPosition)name=pName;age=pAge;/可以增加对age等属性的存取限制条件education=pEducation;position=pPosition;publicStringintroduction()return大家好!我是+name+,我今年+age+岁,学历+education+,目前职位是+position;,带参数的构造方法2-2,通过调用带参数的构造方法,简化对象初始化的代码,publicclassTeacher6Testpublicstaticvoidmain(Stringargs)Teacher6teacher=newTeacher6(李芳,23,本科,咨询师);System.out.println(teacher.introduction();,创建对象时,一并完成了对象成员的初始化工作,大家好!我是李芳,我今年23岁,学历本科,目前职位是咨询师,小结6,编写一个类Book2,代表教材:具有属性:名称(title)、页数(pageNum),其中页数不能少于200页,否则输出错误信息,并赋予默认值200具有方法:detail,用来在控制台输出每本教材的名称和页数。具有带参数的构造方法:用来完成对象的初始化工作,并在构造方法中完成对页数的最小值限制编写测试类Book2Test进行测试:初始化一个Book2对象,并调用该Book2对象的detail方法,看看输出是否正确,生活中的方法重载,类,方法,方法参数,方法实现,司机,轿车,巴士,火车,驾驶,启动、行驶、,等待乘客上车、启动、行驶、到站停车、,正点发车、行驶、到站停车、,如果用代码实现,我们需要三个方法,这些方法的方法名称相同,参数类型不同,方法重载的代码示例1,方法重载并不陌生java.io.PrintStream类的println方法能够打印数据并换行,根据数据类型的不同,有多种实现方式,publicclassTestpublicstaticvoidmain(Stringargs)inti=0;charc=z;Stringstr=hello;System.out.println(i);System.out.println(c);System.out.println(str);,PrintStream,println(int)println(char)println(String),方法名相同,参数类型不同,调用不同的println方法,方法重载,方法重载的代码示例2,java.lang.Math类的max()方法能够从两个数字中取出最大值,它有多种实现方式运行时,Java虚拟机先判断给定参数的类型,然后决定到底执行哪个max()方法,publicclassTestpublicstaticvoidmain(Stringargs)Math.max(1,2);Math.max(1.0F,2.F);Math.max(1.0,2);,方法重载,构造方法重载2-1,构造方法重载是方法重载的典型示例,publicclassTeacher7privateStringname;/教员姓名privateStringschool=北京中心;/所在中心publicTeacher7(Stringname)this.name=name;/设定教员姓名publicTeacher7(Stringname,Stringschool)this.name=name;/设定教员姓名this.school=school;/设定教员的所在中心publicStringintroduction()return大家好!我是+school+的+name;,构造方法重载,构造方法重载2-2,通过调用不同的构造方法来表达对象的多种初始化行为例如:默认情况下,教师来自北京中心,初始化时,只需提供教员姓名有时,需要提供所在中心名称及教员姓名,publicclassTeacher7Testpublicstaticvoidmain(Stringargs)Teacher7teacher1=newTeacher7(李芳);System.out.println(teacher1.introduction();Teacher7teacher2=newTeacher7(张欣,天津中心);System.out.println(teacher2.introduction();,大家好!我是北京中心的李芳大家好!我是天津中心的张欣,小结7,编写一个类Book3,代表教材:具有属性:名称(title)、页数(pageNum)、种类(type)具有方法:detail,用来在控制台输出每本教材的名称、页数、种类具有两个带参构造方法:第一个构造方法中,设置教材种类为“计算机”(固定),其余属性的值由参数给定;第二个构造方法中,所有属性的值都由参数给定编写测试类Book3Test进行测试:分别以两种方式完成对两个Book3对象的初始化工作,并分别调用它们的detail方法,看看输出是否正确,给定如下Java代码,请指出代码中的错误,并解释原因。,publicclassSampleprivateintx;publicSample()x=1;publicSample(inti)x=i;publicintSample(inti)x=i;returnx+;privateSample(inti,Strings)publicSample(Strings,inti)privateSampla(inti)x=i+;privatevoidSampla(inti)x=i+;,总结,无参构造方法,带参构造方法,不是构造方法,带参构造方法,带参构造方法,名称与类名不相同,不是构造方法,生活中的继承2-1,生活中,继承的例子随处可见,动物,食草动物,食肉动物,谁是父类?谁是子类?能说出继承的特点吗?,继承需要符合的关系:is-a,父类更通用、子类更具体,生活中的继承2-2,子类具有父类的一般特性(包括属性和行为),以及自身特殊的特性,巴士是汽车吗?卡车是汽车吗?出租车是汽车吗?,汽车,请问:出租车包含哪些属性和行为呢?,为什么需要继承4-1,开发ACCP教员类,其中教员分为Java教员以及.NET教员,各自的要求如下:Java教员属性:姓名、所属中心方法:授课(步骤:打开Eclipse、实施理论课授课)、自我介绍.NET教员属性:姓名、所属中心方法:授课(步骤:打开Visualstudio2005、实施理论课授课)、自我介绍,请问:以下这个解决方案中存在着什么问题?,为什么需要继承4-2,代码存在重复,违背了“writeonce,onlyonce”的原则,为什么需要继承4-3,如何改进?有没有可能建立继承关系,让子类自动继承父类的属性和方法?,Java教员是教员吗?.NET教员是教员吗?,publicclassAccpTeacherprivateStringname;/教员姓名privateStringschool;/所在中心publicAccpTeacher(StringmyName,StringmySchool)name=myName;school=mySchool;publicvoidgiveLesson()System.out.println(知识点讲解);System.out.println(总结提问);publicvoidintroduction()System.out.println(大家好!我是“+school+的+name+。);,现在,所有子类中相同的代码都抽取到父类中了,为什么需要继承4-4,publicclassAccpJavaTeacher2extendsAccpTeacherpublicAccpJavaTeacher2(StringmyName,StringmySchool)super(myName,mySchool);publicvoidgiveLesson()System.out.println(启动Eclipse);super.giveLesson();,publicclassAccpDotNetTeacher2extendsAccpTeacherpublicAccpDotNetTeacher2(StringmyName,StringmySchool)super(myName,mySchool);publicvoidgiveLesson()System.out.println(启动VisualStudio.NET);super.giveLesson();,使用继承,可以有效实现代码复用,子类自动继承父类的属性和方法,子类中不再存在重复代码,如何实现继承3-1,在Java语言中,用extends关键字来表示一个类继承了另一个类,例如:,publicclassAccpJavaTeacher2extendsAccpTeacher/其余代码省略,在父类中只定义一些通用的属性与方法,例如:,publicclassAccpTeacherprivateStringname;/教员姓名privateStringschool;/所在中心publicAccpTeacher(StringmyName,StringmySchool)/初始化属性值publicvoidgiveLesson()/授课方法的具体实现publicvoidintroduction()/自我介绍方法的具体实现,如何实现继承3-2,子类自动继承父类的属性和方法,子类中可以定义特定的属性和方法,publicclassAccpTeacherprivateStringname;/教员姓名privateStringschool;/所在中心publicAccpTeacher(StringmyName,StringmySchool)/初始化属性值publicvoidgiveLesson()/授课方法的具体实现publicvoidintroduction()/自我介绍方法的具体实现,publicclassAccpJavaTeacher2extendsAccpTeacherpublicAccpJavaTeacher2(StringmyName,StringmySchool)super(myName,mySchool);publicvoidgiveLesson()System.out.println(启动Eclipse);super.giveLesson();,由于giveLesson()方法与父类的实现有所不同,因此重写了该方法,方法重写:子类和父类的方法具有相同的名称、参数列表、返回类型,父类中的属性和方法可以被子类继承,publicclassAccpJavaTeacher2extendsAccpTeacherpublicAccpJavaTeacher2(StringmyName,StringmySchool)super(myName,mySchool);,如何实现继承3-3,子类的构造方法中,通过super关键字调用父类的构造方法,方法重写后,通过super关键字调用父类的方法,publicclassAccpJavaTeacher2extendsAccpTeacherpublicvoidgiveLesson()System.out.println(启动Eclipse);super.giveLesson();,通过调用父类的构造方法,完成对属性值的初始化,一切类的“祖先”Object,在Java中,所有的Java类都直接或间接地继承了java.lang.Object类,publicclassMyObject/,publicclassMyObectextendsObject/,在Eclipse中调用MyObject对象的成员,会自动弹出继承自Object的所有方法,小结8,请编码实现动物世界的继承关系:动物(Animal)具有行为:吃(eat)、睡觉(sleep)动物包括:兔子(Rabbit),老虎(Tiger)这些动物吃的行为各不相同(兔子吃草,老虎吃肉);但睡觉的行为是一致的。请通过继承实现以上需求,并编写测试类AnimalTest进行测试。,为什么需要多态5-1,在ACCP教员类的基础上,开发一个类代表总部,负责对各教员进行评估,评估内容包括:1、教员的自我介绍2、教员的授课,为什么需要多态5-2,publicclassHQ1publicvoidjudge(AccpJavaTeacher2t)t.introduction();t.giveLesson();publicvoidjudge(AccpDotNetTeacher2t)t.introduction();t.giveLesson();publicstaticvoidmain(Stringargs)HQ1hq=newHQ1();hq.judge(newAccpJavaTeacher2(李明,北京中心“);hq.judge(newAccpDotNetTeacher2(张明,天津中心“);,第一种解决方案,大家好!我是北京中心的李明.启动Eclipse知识点讲解总结提问大家好!我是天津中心的张明.启动VisualStudio2005知识点讲解总结提问,控制台输出,为什么需要多态5-3,现在,升级ACCP教员类,增加一种新类型:AccpDBTeacher,该类型的教员专门负责教授数据库,要求如下:属性:姓名、所属中心方法:授课(启动SqlServer、实施理论课授课)、自我介绍同时,总部也负责对这类教员进行评估,为什么需要多态5-4,如果在第一种解决方案的基础上去解决,我们需要如下两个步骤:建立AccpDBTeacher类修改总部类,增加方法:judge(AccpDBTeachert),每增加一种新的教员类型,都要修改总部类,增加相应的judge(评估)方法,代码的可扩展性及可维护性极差,能找到这个解决方案的弊端吗?,为什么需要多态5-5,第二种解决方案使用多态,publicclassHQ3publicvoidjudge(AccpTeachert)t.introduction();t.giveLesson();publicstaticvoidmain(Stringargs)HQ3hq=newHQ3();hq.judge(newAccpJavaTeacher2(李明,北京中心“);hq.judge(newAccpDotNetTeacher2(张明,天津中心);hq.judge(newAccpDBTeacher(“李岚,北京中心“);,可以接收子类类型,根据实际创建的对象类型调用相应方法,大家好!我是北京中心的李明.启动Eclipse知识点讲解总结提问大家好!我是天津中心的张明.启动VisualStudio2005知识点讲解总结提问大家好!我是北京中心的李岚.启动SqlServer知识点讲解总结提问,控制台输出,使用多态之后,当需要增加新的子类类型时,无需更改总部类,程序的可扩展性及可维护性增强,什么是多态,简单来说,多态是具有表现多种形态的能力的特征同一个实现接口,使用不同的实例而执行不同操作,彩色打印机,打印机,黑白打印机,打印效果:彩色,打印效果:黑白,打印,打印,publicclassAccpTeacherpublicvoidgiveLesson()System.out.println(知识点讲解);System.out.println(总结提问);,如何实现多态,1、子类重写父类的方法2、编写方法时,使用父类定义的方法3、运行时,根据实际创建的对象类型动态决定使用哪个方法,小结9,请编码实现如下需求:乐器(Instrument)分为:钢琴(Piano)、小提琴(Violin)各种乐器的弹奏(play)方法各不相同。编写一个测试类InstrumentTest,要求:编写方法testPlay,对各种乐器进行弹奏测试。要依据乐器的不同,进行相应的弹奏。在main方法中进行测试,总结2-1,classBasepublicStringname;publicBase()name=Base;publicBase(StringpName)name=pName;publicvoidmethod()System.out.println(name);,classChildextendsBasepublicChild()super(Child1);name=Child2;,给定如下Java代码,编译运行后,输出结果是什么?,publicclassSamplepublicstaticvoidmain(Stringargs)Childc=newChild();c.method();,Child2,控制台输出,1,2,3,总结2-2,给定如下Java代码,编译运行后,输出结果是什么?,publicclassAccpTeacherpublicvoidgiveLesson()System.out.println(知识点讲解);,publicclassAccpDBTeacherextendsAccpTeacherpublicvoidgiveLesson()System.out.println(启动SqlServer);,1,2,publicclassTestpublicstaticvoidmain(Stringargs)AccpTeachert=newAccpDBTeacher();t.giveLesson();,控制台输出,启动SqlServer,为什么需要包,生活案例,文档分门别类,易于查找,不同内容的文档可以放在不同的袋子中,拥有相同的名字,避免冲突,易于管理,允许类组成较小的单元(类似文件夹),易于找到和使用相应的文件,防止命名冲突,更好的保护类、数据和方法,为什么需要包,Java的系统程序包,如何创建包,packagemyjava.sg.chap3;publicclassSchoolpublicStringtoString(),包名,使用package声明包,以分号结尾,如果有包的声明,一定作为Java源代码的第一条语句,包与目录的关系,创建包myjava.sg.chap3,即创建目录结构.myjavasgchap3,包与文件夹同名。,myjava,sg,chap3,School.java,Hello.java,如何导入包,为了使用不在同一包中的类,需要在Java程序中使用import关键字导入这个类,importjava.util.*;/导入java.util包中所有类importjava.lang.*;/导入java.lang包中所有类,关键字import并不陌生,import包名.类名;,1、系统包(eg:java.lang)2、自定义包:net.javagroup,*:指包中的所有类Hello:指包中的Hello类,文件1:MyClass1.java,文件2:MyClass2.java,文件3:Test.java,packageMypackage;publicclassMyClass1publicvoidshow1()System.out.println(这是类MyClass1);,packageMypackage.Mypackage1;publicclassMyClass2publicvoidshow2()System.out.println(这是类MyClass2);,importMypackage.*;importMypackage.Mypackage1.*;publicclassTestpublicstaticvoidmain(Stringargs)MyClass1obj1=newMyClass1();obj1.show1();MyClass2obj2=newMyClass2();obj2.show2();,代码阅读,School.java位于myjavasgchap3中,Hello.java位于myjavademomypackage中,下面程序空缺部分需要填入代码吗?如果需要,是什么?,/添加代码2/添加代码3publicclassHellopublicstaticvoidmain(Stringargs)Schoolcenter=newSchool();System.out.println(center);,/添加代码1publicclassSchoolpublicStringtoString()return这个是School类;,packagemyjava.sg.chap3;,packagemyjava.demo.mypackage;,importmyjava.sg.chap3.School;,一旦类放入包中,包名和类名共同组合才能描述一个类,这里java.lang.System;自动导入,生活中的接口,电脑主板上的PCI插槽的规范就类似于Java接口,声卡,显卡,网卡,每种卡的内部结构都不相同,可以把声卡、网卡、显卡都插在PCI插槽上,而不用担心哪个插槽是专门插哪个卡的,主板,Java接口的声明,一个Java接口是一些抽象方法和常量的集合,publicinterfacePCIpublicvoidstart();publicvoidstop();,这是Java接口,相当于主板上的PCI插槽的规范,publicinterface接口名extends父接口名列表publicstaticfinal类型常量名=常量值;publicabstract返回值类型方法名(参数列表);,Java接口的实现,classSoundCardimplementsPCIpublicvoidstart()System.out.println(Dudu.);publicvoidstop()System.out.println(Soundstop!);,Java接口中定义的方法在不同的地方被实现,可以具有完全不同的行为,classNetworkCardimplementsPCIpublicvoidstart()System.out.println(Send.);publicvoidstop()System.out.println(Networkstop!);,声卡、网卡都实现了PCI插槽的规范,但行为完全不同,修饰符class类名extends父类implements接口列表,Java接口的应用,publicclassAssemblerpublicstaticvoidmain(Stringargs)PCInc=newNetworkCard();PCIsc=newSoundCard();nc.start();sc.start();,可以使用接口标识类型运行时,根据实际创建的对象类型调用相应的方法实现,Dudu.Send.,控制台输出,2,1,利用接口实现多重继承,利用接口,可以弥补了Java单一继承的弱点,用另一种方式实现多重继承。,publicclassMainBoardpublicvoidusePCICard(_p)p.start();p.stop();,publicclassAssemblerpublicstaticvoidmain(Stringargs)MainBoardmb=newMainBoard();/在主板上插入网卡/在主板上插入声卡,通过这个方法,主板上可以插入任意符合PCI插槽规范的卡,PCInc=newNetworkCard();mb.usePCICard(nc);,PCIsc=newSoundCard();mb.usePCICard(sc);,PCI,可以通过更换实现接口的类来更换系统的实现,接口作为参数,接口作为参数使用,传递的是实现接口的对象,publicinterfaceIntroducepublicStringdetail();publicvoidintroduction()detail();privatevoidshowMessage();voidspeak();,Java接口中的方法不能是private,Java接口中不能有方法体实现,编译器会自动加上public修饰符,请指出下列Java代码中的错误。,为什么需要常量,生活中,一周有七天,如何用代码表示?,publicclassWeekprivateintdays=7;publicstaticvoidmain(Stringargs)Weekw=newWeek();System.out.println(一周有+w.days+天);,publicclassWeekprivateintdays=7;publicstaticvoidmain(Stringargs)Weekw=newWeek();w.days+;System.out.println(一周有+w.days+天);,一周有7天,控制台输出,然而,总有不尽人意的事情发生:,一周有8天,控制台输出,如何保证变量的值在运行期无法被改变?使用常量,什么是常量,常量是一种标识符,它的值在运行期间恒定不变常量标识符在程序中只能被引用,而不能被重新赋值,常量的优点,如果不使用常量,直接在程序中填写数字或字符串,将会有什么麻烦?,publicstaticdoubletoRadians(doubleang)returnang/180.0*3.14159265358979323846;publicstaticdoubletoDegrees(doubleang)returnang*180.0/3.14159265358979323846;,publicstaticfinaldoublePI=3.14159265358979323846;/圆周率publicstaticdoubletoRadians(doubleang)returnang/180.0*PI;publicstaticdoubletoDegrees(doubleang)returnang*180.0/PI;,程序的可读性变差:用户很难理解数字或字符串的意思,程序的可维护性变差:如果数值改变,则需要在很多地方改动,既麻烦又易出错,使用常量可以增强程序的可读性、可维护性,Java中常量的定义规则,加入final关键字代表常量,加入static关键字代表类变量尽量使用含义直观的常量表示多次出现的数字或字符串,publicclassAccpStudentpublicstaticfinalintFEMALE=1;/代表女性publicstaticfinalintMALE=2;/代表男性privateintsex;/性别publicvoidsetSex(intsex)if(sex=FEMALE)System.out.println(这是一名女学生);elseif(sex=MALE)System.out.println(这是一名男学生);this.sex=sex;,在Java接口中声明常量,在Java接口中声明的变量在编译时会自动加上staticfinal的修饰符,即声明为常量,因而Java接口通常是存放常量的最佳地点,publicinterfaceAccpSchoolTypepublicstaticfinalStringACCP=ACCP加盟中心;publicstaticfinalStringBENET=BENET直营中心;,publicinterfaceAccpSchoolTypeStringACCP=ACCP加盟中心;StringBENET=BENET直营中心;,等同于,内部类(InnerClass)是在一个类的内部嵌套定义的类,它可以是类的成员,也可以在一个语句块内部定义,还可以在表达式内部匿名定义.包含内部类的类称为外部类。,内部类,举例:classa.classb.,a是外部类,b是内部类,1.成员内部类(非静态)在类体中定义的内部类,是外部类的成员。必须先产生外部类的对象,然后通过这个对象来访问。2.静态内部类内部类声明加上static修饰符,别的类可通过外部类的名称来直接访问。3.局部内部类声明在方法中的类,只能在包含它的方法中使用。4.匿名内部类没有名称的局部内部类,类的声明和实现直接写在一个表达式中,或写在方法调用的小括号中。,内部类,OO思想总结,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!