第二章 Java面向对象编程-2_第1页
第二章 Java面向对象编程-2_第2页
第二章 Java面向对象编程-2_第3页
第二章 Java面向对象编程-2_第4页
第二章 Java面向对象编程-2_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

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

文档简介

第二章Java面向对象编程(继承)继承从现有类派生出新类,称为继承。通过继承,可以实现源代码级的复用,提高程序的可维护性。其中被继承的类称为父类,派生得到的类称为子类。执行继承时,子类将获得父类的属性和行为,并具有自身特有的属性和行为,java语言不支持多重继承。

继承是面向对象的最重要的特色之一,它允许创建分等级层次的类。Emoloyee类:

姓名

性别年龄Worker类:

工种工龄服装津贴Work()Officer类:级别职称是否配备交通工具Manage()职员类工人类,继承了父类的姓名等属性干部类,还包含级别等新的属性和功能Animal类:-leg-kindAnimal()eat()move()getLegs()setLegs()Fish:Fish()Bird:Bird()Lion:Lion()Ostrich:Ostrich()hideHead()多层次类结构继承的实现继承通过关键字extends声明。声明一个继承父类的类的通常形式如下:classsubclass-nameextendssuperclass-name{//类体}

注意如省略extends,默认父类为Object类只能有一个直接父类,即单继承子类继承父类的全部成员继承示例classEmployee{

Stringname;//姓名

charsex;//性别

Employee(Stringn,chars){name=n;sex=s;}publicStringgetName(){returnname;}publicchargetSex(){returnsex;}}classOfficerextendsEmployee

{

chargrade;//级别

Stringprofession;//职称

Officer(Stringn,chars,charg,Stringp){

name=n;sex=s;

grade=g;profession=p;}publicchargetGrade(){returngrade;}

publicbooleangetProfession(){returnprofession;}publicvoidmanage(){System.out.println(“管理工人。”);}}classInheDemo{publicstaticvoidmain(Stringargs[]){Officerw=newOfficer(“M.John”,‘M’,‘B’,“高级”);

System.out.println(“员工信息");

System.out.println("姓名

:"+w.getName());System.out.println("性别

"+w.getSex());

System.out.println(“级别

:"+w.getgrade());System.out.println(“职称:"+w.getProfession());

w.manage();}}成员的访问与继承classA{inti,j;voidshowij(){System.out.println(”i=”+i+”,j=”+j);}}classBextendsA{intk;voidshowk(){System.out.println(”k=”+k);}voidsum(){System.out.println(”sum=”+i+j+k);}}classDemo{publicstaticvoidmain(Stringargs[]){Aobj1=newA();Bobj2=newB();obj1.i=1;obj1.j=2;obj1.showij();obj2.i=3;obj2.j=4;obj3.k=5;obj2.showij();obj2.showk();obj2.sum();}}改成私有privatesuper引用super有两种使用形式:一是在子类的构造方法中直接调用父类的构造函数,二是用来访问被子类的成员隐藏或覆盖的父类成员。

调用父类构造函数形式:super(参数);其中,方法名称换成super,参数跟父类构造函数参数一致,注意super必须是在子类构造函数中的第一个执行语句。而且,子类构造函数中如果没有super()语句,系统会自动加上一条super()的调用。构造函数的调用,是按照继承的顺序,从超类到子类进行的。访问被子类的成员覆盖的父类成员。

classA{inti;voidshow(){System.out.println(”i=”+i);}}classBextendsA{inti;voidshow(){System.out.println(”i=”+i+“父类中的i”+super.i);}}方法覆盖方法覆盖是Java语言实现多态性机制的另一种方式,也称方法的重写。在类层次结构中,如果子类中的一个方法与父类中的方法有相同的方法名并具有相同数量和类型的参数列表,不同之处只有方法体,这种情况称为方法覆盖。当一个覆盖方法通过父类引用被调用时,Java语言根据当前被引用对象的类型来决定执行哪个版本的方法。可以通过super关键字调用直接父类中覆盖的方法。classA{

doublef(intx,doubly){...}}classBextendsA{doublef(intx,doubly){...}}多态多态就是一个类有其他的表示方式,但彼此之间必须是继承的关系,多态能够实现动态方法分配。Animal类:-leg-kindAnimal()eat()move()getLegs()setLegs()Fish:Fish()move()Bird:Bird()move()Lion:Lion()Ostrich:Ostrich()move()hideHead注意:1.不管用哪种引用表示对象,归根到底表示的是实例化时所生成的对象。2.当把某对象用其他引用表示时,则只能使用该引用所提供的属性和方法。3.如父类有方法被子类重写,则以父类引用调用该方法时,会执行子类的方法。方法覆盖示例classA{inti,j;voidshow(){System.out.println(”i=”+i+”,j=”+j);}}classBextendsA{intk;voidshow(){System.out.println(”i=”+i+”,j=”+j+”,k=”+k);}}classInheDemo{publicstaticvoidmain(Stringargs[]){Aobj1=newA();Aobj2=newB();Bobj3=newB();obj1.show();obj2.show();obj3.show();}}抽象方法用abstract修饰的方法称为抽象方法。抽象方法是一种只有方法头、而没有具体方法的方法。如:classAbstractTest{abstractvoidabstractmethod();}注意:抽象方法只有方法头的声明,用;代替方法体,没有大括号{}。

抽象方法抽象类超类中只定义了让所有子类共享的抽象方法,具体的细节需要子类去实现,这样的超类很抽象,称为抽象类。注意,抽象类是不可使用的,或者说不能实例化对象。(但可以有构造函数)当子类继承一个抽象类时,它必须重写父类的所有抽象方法,否则,子类也必须定义为抽象类。abstractclassEmployee{ intbasic=2000;

abstractvoidsalary();//抽象方法}classManagerextendsEmployee{voidsalary(){ System.out.println("薪资等于"+basic*5);}}

classWorkerextendsEmployee{voidsalary(){ System.out.println("薪资等于"+basic*2);}}在子类中提供实现在子类中提供实现抽象方法没有方法主体接口Java程序一次只能继承一个类。如果想实现多继承可以通过接口实现。接口是一种特殊的类,是一些抽象方法和固定变量的集合。接口不能有任何具体的方法,必须全是抽象方法;在接口中也可以声明变量,但必须是常量类型。接口可以通过关键字interface定义。通过接口可以实现不相关类的相同行为,而不需考虑这些类之间的层次关系。接口的定义//含抽象方法的接口interfacemyinterface{abstractintadd(intx,inty); abstractvoidvolume(intx,inty,intz);}//定义包含常量的接口interfacemyconstants{ publicstaticfinaldoubleprice=1450.00;publicstaticfinalintcounter=5;}定义一个接口:实现接口用关键字implements实现接口,例如:classdemoimplementsmyinterface在类中对接口里面的方法进行重写(实现)即可如果有一个以上接口的被实现,则用逗号隔开接口名称,如下所示:

classdemoimplementsMycalc,Mycount接口使用示例interfaceA{doubleg=9.8;voidshow();}classInterfaceTest{publicstaticvoidmain(Stringargs[]){Bb=newB();b.show();}}classBimplementsA{publicvoidshow(){System.out.println(“g=“+g);}}省略修饰符接口引用接口不能包含构造函数,也就是说,接口不能实例化对象。但可以用接口名去引用一个对象,该对象必须是由实现了接口的类所实例化的对象。interfaceA{

doublef(intx,doubly);}classBimplementsA{doublef(intx,doubly){...}}Bobj1=newB();Aobj2=newB();obj1.f(1,2);obj2.f(3,4);包为了管理类和接口,Java体系制定了包的概念,包是类、接口和子包的集合,利用包可以将用途相近但功能不同的类或接口放在一起,就像在文件夹中,使类的管理更清晰。包是一种松散的类集合,一般不要求处于同一个包中的类有明确的相互关系,如包含、继承等。包也称为类库。建立包创建一个包的语法:package包名;如果java源文件省略了package语句,在该文件中所有类被包含在一个默认的没有名称的包中。在java中,可以创建一个多层次包,只要在每个包与上层包之间用“.”分隔开,如下所示:packagepkg1.pkg2.pkg3;在创建包后还需要在操作系统当前目录下创建一个与该包匹配的文件夹结构。导入包导入一个包的语法:import包名.*;导入一个包时,应使用包名称加类名称的形式。如引入上例中的pkg3中的类,可写入以下语句:importpkg1.pkg2.pgk3.类名;为了在任何地方都可使用的自定义的包,可将当前存放自定义包的目录加到classpath中。访问控制符Java语言提供的访问控制符范围同一个类同一个包不同包的子类不同包的非子类Java语言的访问控制符有public公共访问控制符

private私有访问控制符protected保护访问控制符默认访问控制符其中,修使类的访问控制符可以是:public或默认访问控制符,修饰域或方法的可以上面的任何一种。注意,public会造成安全性和数据封装性下降,所以一般应减少使用public。同一个类中同一个包中不同包中的子类不同包中的非子类private允许protected允许允许允许public允许允许允许允许friendly允许允许常见的系统包包名包含内容java.applet提供创建applet小程序所需要的类java.awt包含用于创建用户界面和绘制图形图像的所有类java.beans包含与开发beans有关的类java.io提供与输入和输出相关的类java.lang提供Java语言程序设计的基础类提供实现网络操作的类java.sql提供实现数据库访问功能的类java.text提供处理文本、日期、数字和消息的类和接口java.util提供处理日期、时间、随机数生成等各种实用工具的类提供用于网络应用程序的类javax.swing提供一组与AWT功能相同的纯Java的组件类Java是一种面向对象语言,Java中的类把方法与数据连接在一起,并构成了自包含式的处理单元。但在Java中不能定义基本类型(primitivetype),为了能将基本类型视为对象来处理,并能使用相关的方法,Java为每个基本类型都提供了封装类。这样,我们便可以把这些基本类型转化为对象来处理数据封装类数据类型封装类booleanBooleanbyteBytecharCharacterdoubleDoublefloatFloatintIntegerlongLongshortShortObject类Object类包括在java.lang

包中,被称为根类,是Java类体系结构的根。Java语言中的每个类都是Object

温馨提示

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

评论

0/150

提交评论