您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > Java语言程序设计基础教程课件(第4章)
第4章继承、接口和内部类继承、超类和子类抽象类和接口内部类Class类4.1继承、超类和子类继承是面向对象编程技术的一块基石,是一种由已有的类创建新类的机制。运用继承,可以先创建一个通用类,它定义了一系列相关属性的一般特性。该类可以被更具体的类继承,每个具体的类都增加一些自己特有的东西。在Java术语学中,被继承的类叫超类(superclass),继承超类的类叫子类(subclass)。子类不能继承父类中访问权限为private的成员变量和方法。子类可以重写父类的方法,及命名与父类同名的成员变量。Java不支持多重继承,即一个类从多个超类派生的能力。通过继承实现代码复用。Java中所有的类都是通过直接或间接地继承java.lang.Object类得到的。4.1.1子类继承一个类,只要用extends关键字把一个类的定义合并到另一个中就可以了。创建子类的一般格式为:classSubClassextendsSuperClass{…}例如:classStudentsextendsPeople{…}4.1.2子类的继承子类通过隐藏父类的成员变量和重写父类的方法,可以把父类的状态和行为改变为自身的状态和行为。例如:classSuperClass{intx;…voidsetX(){x=0;}…}classSubClassextendsSuperClass{intx;//隐藏了父类的变量x…voidsetX(){//重写了父类的方法setX()x=5;}…}注意:子类中重写的方法和父类中被重写的方法要具有相同的名字,相同的参数表和相同的返回类型,只是函数体不同。【例4-1】一个关于继承的简单例子。//Createasuperclass.classSA{inti,j;voidshowij(){System.out.println(iandj:+i++j);}}//CreateasubclassbyextendingclassA.classSBextendsA{intk;voidshowk(){System.out.println(k:+k);}voidsum(){System.out.println(i+j+k:+(i+j+k));}}classSimpleInheritance{publicstaticvoidmain(Stringargs[]){SAsuperOb=newSA();SBsubOb=newSB();//Thesuperclassmaybeusedbyitself.superOb.i=10;superOb.j=20;System.out.println(ContentsofsuperOb:);superOb.showij();System.out.println();//ThesubclasshasAccesstoallpublicmembersofitssuperclass.subOb.i=7;subOb.j=8;subOb.k=9;System.out.println(ContentsofsubOb:);subOb.showij();subOb.showk();System.out.println();System.out.println(Sumofi,jandkinsubOb:);subOb.sum();}}4.1.3super关键字与类中this关键字相似,Java语言中使用关键字super表示父类对象。通过在子类中使用super做前缀可以引用被子类隐藏的父类变量或被子类重写的父类方法。super用来引用当前对象的父类,虽然构造方法不能够继承,但利用super关键字,子类构造方法中也可以调用父类的构造方法。Super的使用有2种情况:1.操作被隐藏的变量和方法访问父类被隐藏的成员变量,一般格式为:super.variable;调用父类中被重写的方法,一般格式为:super.Method([paramlist]);假如成员变量x和方法y()分别是被子类隐藏的父类的变量和方法,则:super.x//表示父类的成员变量xsuper.y()//表示父类的成员方法y()【例4-2】利用supers操作父类被隐藏和重写的变量和方法。classep4_2_a{intn;floatf(){floatsum=0;for(inti=1;i=n;i++){sum=sum+i;}returnsum;}}classep4_2_bextendsep4_2_a{intn;floatf(){floatc;super.n=n;c=super.f();returnc/n;}floatg(){floatc;c=super.f();returnc/2;}}classep4_2{publicstaticvoidmain(Stringargs[]){ep4_2_baver=newep4_2_b();aver.n=100;System.out.println(result_one=+aver.f());System.out.println(result_two=+aver.g());}}2.使用super调用父类的构造方法子类不能继承父类的构造方法,若子类想使用父类的构造方法,必须在子类的构造方法中利用super来调用,且super必须是子类构造方法中的第一条语句。调用父类的构造函数,一般格式为:super([paramlist]);【例4-3】利用supers操作父类的构造方法。classep4_3_student{intnum;Stringname;ep4_3_student(intnum,Stringname){this.num=num;this.name=name;System.out.println(姓名:+name+\n学号:+num);}}classep4_3_univerextendsep4_3_student{boolean婚否;ep4_3_univer(intnum,Stringname,booleanb){super(num,name);婚否=b;System.out.println(婚否:+婚否);}}classep4_3{publicstaticvoidmain(Stringargs[]){ep4_3_universtudent_one=newep4_3_univer(1234,小强,false);}}程序的运行结果如下所示:需要注意的是,若子类调用父类的构造方法,在子类的构造方法中省略掉super关键字,则系统默认有“super()”,即调用父类不带参数的构造方法。由于Java语言规定如果一个类中含有一个或多个构造方法,系统不提供默认的构造方法(不含参数的构造方法),所以当在父类中定义了多个构造方法时,应考虑包括一个不带参数的构造方法,以防止子类省略super关键字时出现错误。4.2抽象类和接口Java语言中,用abstract关键字来修饰一个类时,这个类叫做抽象类,用abstract关键字来修饰一个方法时,这个方法叫做抽象方法。格式如下:abstractclassabstractClass{…}//抽象类abstractreturnTypeabstractMethod([paramlist])//抽象方法4.2.1抽象类抽象类就是不能使用new方法进行实例化的类,即没有具体实例对象的类。抽象类有点类似“模板”的作用,目的是根据其格式来创建和修改新的类。对象不能由抽象类直接创建,只可以通过抽象类派生出新的子类,再由其子类来创建对象。在抽象类中的成员方法可以包括一般方法和抽象方法。抽象方法就是以abstract修饰的方法,这种方法只声明返回的数据类型、方法名称和所需的参数,没有方法体,也就是说抽象方法只需要声明而不需要实现。当一个方法为抽象方法时,意味着这个方法必须被子类的方法所重写,否则其子类的方法仍然是abstract的。抽象类中不一定包含抽象方法,但是包含抽象方法的类一定要被声明为抽象类。抽象类本身不具备实际的功能,只能用于派生其子类,而定义为抽象的方法必须在子类派生时被重写。抽象类中可以包含构造方法,但是构造方法不能被声明为抽象。一般来说,由于不能够用抽象类直接创建对象,因此在抽象类内定义构造方法是多余的。需要注意的是:抽象类不能用final来修饰,即一个类不能既是最终类又是抽象类。abstract不能与private、static、final、native并列修饰同一个方法。【例4-5】定义抽象类Animal,从抽象类派生子类Horse和Dog,实现父类的抽象方法。abstractclassep4_5_Animal{//定义抽象类Stringstr;ep4_5_Animal(Strings){//定义抽象类的一般方法str=s;}abstractvoideat();//定义抽象方法}classep4_5_Horseextendsep4_5_Animal{//定义继承Animal的子类Stringstr;ep4_5_Horse(Strings){super(s);//调用父类的构造方法}voideat(){//重写父类的抽象方法System.out.println(马吃草料!);}}classep4_5_Dogextendsep4_5_Animal{Stringstr;ep4_5_Dog(Strings){super(s);}voideat(){System.out.println(狗吃骨头!);}}classep4_5{publicstaticvoidmain(Stringargs[]){ep4_5_HorseHorse1=newep4_5_Horse(马);ep4_5_DogDog1=newep4_5_Dog(狗);Horse1.eat();Dog1.eat();}}4.2.2接口接口是抽象类的一种,只包含常量和方法的定义,而没有变量和方法的实现,且其方法都是抽象方法。它的用处体现在下面几个方面:通过接口实现不相关类的相同行为,而无需考虑这些类之间的关系。通过接口指明多个类需要实现的方法。通过接口了解对象的交互界面,而无需了解对象所对应的类。4.2.3接口的定义接口的定义包括接口声明和接口体。接口声明的格式如下:[public]interfaceinterfaceName[extendslistOfSuperInterface]{…}extends子句与类声明的extends子句基本相同,不同的是一个接口可有多个父接口,用逗号隔开,而一个类只能有一个父类。接口体包括常量定义和方法定义,常量定义格式为:typeNAME=value;该常量被实现该接口的多个类共享;具有public,final,static的属性。方法体定义格式为:(具有public和abstract属性)returnTypemethodName([paramlist]);4.2.4接口的实现在类的声明中用implements子句来表示一个类使用某个接口,在类体中可以使用接口中定义的常量,而且必须实现接口中定义的所有方法。一个类可以实现多个接口,在implements子句中用逗号分开。【例4-6】一个接口实现的例子。interfaceep4_6_a{//定义第1个接口doublepi=3.14;abstractdoublearea();}interfaceep4_6_b{//定义第2个接口abstractvoidsetColor(Stringc);}interfaceep4_6_cextendsep4_6_a,ep4_6_b{//接口的多重继承a
本文标题:Java语言程序设计基础教程课件(第4章)
链接地址:https://www.777doc.com/doc-3685622 .html