(精品)Java语言程序设计基础教程课件(第4章).ppt

上传人:s****8 文档编号:82688912 上传时间:2023-03-26 格式:PPT 页数:48 大小:92.50KB
返回 下载 相关 举报
(精品)Java语言程序设计基础教程课件(第4章).ppt_第1页
第1页 / 共48页
(精品)Java语言程序设计基础教程课件(第4章).ppt_第2页
第2页 / 共48页
点击查看更多>>
资源描述

《(精品)Java语言程序设计基础教程课件(第4章).ppt》由会员分享,可在线阅读,更多相关《(精品)Java语言程序设计基础教程课件(第4章).ppt(48页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、第第4章继承、接口和内部类章继承、接口和内部类 n继承、超类和子类继承、超类和子类n抽象类和接口抽象类和接口n内部类内部类nClass类类4.1继承、超类和子类n继承是面向对象编程技术的一块基石,是一种由已有的类创建新类的机制。运用继承,可以先创建一个通用类,它定义了一系列相关属性的一般特性。该类可以被更具体的类继承,每个具体的类都增加一些自己特有的东西。在Java术语学中,被继承的类叫超类(superclass),继承超类的类叫子类(subclass)。子类不能继承父类中访问权限为private的成员变量和方法。子类可以重写父类的方法,及命名与父类同名的成员变量。Java不支持多重继承,即一

2、个类从多个超类派生的能力。n通过继承实现代码复用。Java 中所有的类都是通过直接或间接地继承java.lang.Object类得到的。4.1.1子类n继承一个类,只要用extends关键字把一个类的定义合并到另一个中就可以了。创建子类的一般格式为:qclass SubClass extends SuperClass q q n例如:qclass Students extends People q q4.1.2子类的继承n子类通过隐藏父类的成员变量和重写父类的方法,可以把父类的状态和行为改变为自身的状态和行为。例如:qclass SuperClass qint x;qvoid setX()qx

3、=0;q q qclass SubClass extends SuperClass qint x;/隐藏了父类的变量x q qvoid setX()/重写了父类的方法 setX()qx=5;q qn注意注意:子类中重写的方法和父类中被重写的方法要具有相同的名字,相同的参数表和相同的返回类型,只是函数体不同。【例4-1】一个关于继承的简单例子。n/Create a superclass.nclass SA nint i,j;nvoid showij()nSystem.out.println(i and j:+i+j);nnn/Create a subclass by extending clas

4、s A.nclass SB extends A nint k;nvoid showk()nSystem.out.println(k:+k);nnvoid sum()nSystem.out.println(i+j+k:+(i+j+k);nnnclass SimpleInheritance npublic static void main(String args)nSA superOb=new SA();nSB subOb=new SB();n/The superclass may be used by itself.nsuperOb.i=10;nsuperOb.j=20;nSystem.out.

5、println(Contents of superOb:);nsuperOb.showij();nSystem.out.println();n/The subclass has Access to all public members of its superclass.nsubOb.i=7;nsubOb.j=8;nsubOb.k=9;nSystem.out.println(Contents of subOb:);nsubOb.showij();nsubOb.showk();nSystem.out.println();nSystem.out.println(Sum of i,j and k i

6、n subOb:);nsubOb.sum();nn4.1.3 super关键字n与类中this关键字相似,Java语言中使用关键字super表示父类对象。通过在子类中使用super做前缀可以引用被子类隐藏的父类变量或被子类重写的父类方法。super用来引用当前对象的父类,虽然构造方法不能够继承,但利用super关键字,子类构造方法中也可以调用父类的构造方法。nSuper 的使用有2种情况:1操作被隐藏的变量和方法操作被隐藏的变量和方法n访问父类被隐藏的成员变量,一般格式为:nsuper.variable;n调用父类中被重写的方法,一般格式为:nsuper.Method(paramlist);n

7、假如成员变量x和方法y()分别是被子类隐藏的父类的变量和方法,则:nsuper.x /表示父类的成员变量xnsuper.y()/表示父类的成员方法y()【例4-2】利用supers操作父类被隐藏和重写的变量和方法。nclass ep4_2_a nint n;nfloat f()nfloat sum=0;nfor(int i=1;i=n;i+)nsum=sum+i;nnreturn sum;nnnclass ep4_2_b extends ep4_2_a nint n;nfloat f()nfloat c;nsuper.n=n;nc=super.f();nreturn c/n;nnfloat g

8、()nfloat c;nc=super.f();nreturn c/2;nnnclass ep4_2 npublic static void main(String args)nep4_2_b aver=new ep4_2_b();naver.n=100;nSystem.out.println(result_one=+aver.f();nSystem.out.println(result_two=+aver.g();nn2使用使用super调用父类的构造方法调用父类的构造方法n子类不能继承父类的构造方法,若子类想使用父类的构造方法,必须在子类的构造方法中利用super来调用,且super必须是

9、子类构造方法中的第一条语句。n调用父类的构造函数,一般格式为:nsuper(paramlist);【例4-3】利用supers操作父类的构造方法。nclass ep4_3_student nint num;nString name;nep4_3_student(int num,String name)nthis.num=num;nthis.name=name;nSystem.out.println(姓名:+name+n学号:+num);nnnclass ep4_3_univer extends ep4_3_student nboolean 婚否;nep4_3_univer(int num,St

10、ring name,boolean b)nsuper(num,name);n婚否=b;nSystem.out.println(婚否:+婚否);nnnclass ep4_3 npublic static void main(String args)nep4_3_univer student_one=new ep4_3_univer(1234,小强,false);nnn程序的运行结果如下所示:n需要注意的是,若子类调用父类的构造方法,在子类的构造方法中省略掉super关键字,则系统默认有“super()”,即调用父类不带参数的构造方法。由于Java语言规定如果一个类中含有一个或多个构造方法,系统不

11、提供默认的构造方法(不含参数的构造方法),所以当在父类中定义了多个构造方法时,应考虑包括一个不带参数的构造方法,以防止子类省略super关键字时出现错误。4.2抽象类和接口nJava语言中,用abstract 关键字来修饰一个类时,这个类叫做抽象类,用abstract 关键字来修饰一个方法时,这个方法叫做抽象方法。格式如下:qabstract class abstractClass /抽象类 qabstract returnType abstractMethod(paramlist)/抽象方法 4.2.1抽象类n抽象类就是不能使用new方法进行实例化的类,即没有具体实例对象的类。抽象类有点类似

12、“模板”的作用,目的是根据其格式来创建和修改新的类。对象不能由抽象类直接创建,只可以通过抽象类派生出新的子类,再由其子类来创建对象。n在抽象类中的成员方法可以包括一般方法和抽象方法。抽象方法就是以abstract修饰的方法,这种方法只声明返回的数据类型、方法名称和所需的参数,没有方法体,也就是说抽象方法只需要声明而不需要实现。当一个方法为抽象方法时,意味着这个方法必须被子类的方法所重写,否则其子类的方法仍然是abstract的。n抽象类中不一定包含抽象方法,但是包含抽象方法的类一定要被声明为抽象类。抽象类本身不具备实际的功能,只能用于派生其子类,而定义为抽象的方法必须在子类派生时被重写。抽象类

13、中可以包含构造方法,但是构造方法不能被声明为抽象。一般来说,由于不能够用抽象类直接创建对象,因此在抽象类内定义构造方法是多余的。n需要注意的是:q抽象类不能用final来修饰,即一个类不能既是最终类又是抽象类。qabstract不能与private、static、final、native并列修饰同一个方法。【例4-5】定义抽象类Animal,从抽象类派生子类Horse和Dog,实现父类的抽象方法。nabstract class ep4_5_Animal /定义抽象类nString str;nep4_5_Animal(String s)/定义抽象类的一般方法nstr=s;nnabstract v

14、oid eat();/定义抽象方法nnclass ep4_5_Horse extends ep4_5_Animal /定义继承Animal的子类nString str;nep4_5_Horse(String s)nsuper(s);/调用父类的构造方法nnvoid eat()/重写父类的抽象方法nSystem.out.println(马吃草料!);nnnclass ep4_5_Dog extends ep4_5_Animal nString str;nep4_5_Dog(String s)nsuper(s);nnvoid eat()nSystem.out.println(狗吃骨头!);nnnc

15、lass ep4_5 npublic static void main(String args)nep4_5_Horse Horse1=new ep4_5_Horse(马);nep4_5_Dog Dog1=new ep4_5_Dog(狗);nHorse1.eat();nDog1.eat();nn4.2.2接口n接口是抽象类的一种,只包含常量和方法的定义,而没有变量和方法的实现,且其方法都是抽象方法。它的用处体现在下面几个方面:q通过接口实现不相关类的相同行为,而无需考虑这些类之间的关系。q通过接口指明多个类需要实现的方法。q通过接口了解对象的交互界面,而无需了解对象所对应的类。4.2.3接口的

16、定义n接口的定义包括接口声明和接口体。n接口声明的格式如下:npublic interface interfaceNameextends listOfSuperInterface n n nextends 子句与类声明的extends子句基本相同,不同的是一个接口可有多个父接口,用逗号隔开,而一个类只能有一个父类。n接口体包括常量定义和方法定义,常量定义格式为:ntype NAME=value;n该常量被实现该接口的多个类共享;具有public,final,static的属性。n方法体定义格式为:(具有 public和abstract属性)nreturnType methodName(para

17、mlist);4.2.4接口的实现n在类的声明中用implements子句来表示一个类使用某个接口,在类体中可以使用接口中定义的常量,而且必须实现接口中定义的所有方法。一个类可以实现多个接口,在implements子句中用逗号分开。【例4-6】一个接口实现的例子。ninterface ep4_6_a /定义第1个接口ndouble pi=3.14;nabstract double area();nninterface ep4_6_b /定义第2个接口nabstract void setColor(String c);nninterface ep4_6_c extends ep4_6_a,ep4

18、_6_b /接口的多重继承nabstract void volume();nnclass ep4_6_Cylinder implements ep4_6_c /以第3个接口实现类ndouble radius;nint height;nString color;npublic ep4_6_Cylinder(double r,int h)nradius=r;nheight=h;nnpublic double area()/实现第1个接口的方法nreturn radius*radius*pi;nnpublic void setColor(String c)/实现第2个接口的方法ncolor=c;nS

19、ystem.out.println(形状的颜色:+color);nnpublic void volume()/实现第3个接口的方法nSystem.out.println(圆柱体的体积:+area()*height);nnnclass ep4_6 npublic static void main(String args)nep4_6_Cylinder One=new ep4_6_Cylinder(3.0,5);nOne.setColor(红色);nOne.volume();nn4.3内部类n内部类是在一个类的内部嵌套定义的类,它可以是其它类的成员,也可以在一个语句块的内部定义,还可以在表达式内部

20、匿名定义。4.3.1内部类的定义和使用n内部类有如下特性:q一般用在定义它的类或语句块之内,在外部引用它时必须给出完整的名称。名字不能与包含它的类名相同。q可以使用包含它的类的静态和实例成员变量,也可以使用它所在方法的局部变量。q可以定义为abstract。q可以声明为private或protected。q若被声明为static,就变成了顶层类,不能再使用局部变量。q若想在Inner Class中声明任何static成员,则该Inner Class必须声明为static。n下面是一个说明内部类如何使用的例子,其中,定义了两个内部类:qMouseMotionHandler和MouseEventH

21、andler,分别用来处理鼠标移动事件和鼠标点按事件。【例4-7】一个内部类如何使用的例子。nimport java.awt.*;nimport java.awt.event.*;npublic class TwoListenInner nprivate Frame f;nprivate TextField tf;npublic static void main(String args)nTwoListenInner that=new TwoListenInner();nthat.go();nnpublic void go()nf=new Frame(Two listeners example

22、);nf.add(North,new Label(Click and drag the mouse);ntf=new TextField(30);nf.add(South,tf);nf.addMouseMotionListener(new MouseMotionHandler();nf.addMouseListener(new MouseEventHandler();nf.setSize(300,300);nf.setVisible(true);nnpublic class MouseMotionHandler extends MouseMotionAdapter npublic void m

23、ouseDragged(MouseEvent e)nString s=Mouse dragging:X=+e.getX()+Y=+e.getY();ntf.setText(s);nnnpublic class MouseEventHandler extends MouseAdapter npublic void mouseEntered(MouseEvent e)nString s=The mouse entered;ntf.setText(s);nnpublic void mouseExited(MouseEvent e)nString s=The mouse left the buildi

24、ng;ntf.setText(s);nnn4.3.2匿名类的定义和使用n匿名类是一种特殊的内部类,它是在一个表达式内部包含一个完整的类定义。当一个内部类的类声名只是在创建此类对象时用了一次,而且要产生的新类需继承于一个已有的父类或实现一个接口,才能考虑用匿名类。由于匿名类本身无名,因此它也就不存在构造方法,它需要显示地调用一个无参的父类的构造方法,并且重写父类的方法。n所谓的匿名就是该类连名字都没有,只是显示地调用一个无参的父类的构造方法。4.4 Class类nClass是java.lang包中的类,该类的实例用来封装对象运行时的状态。当一个类被加载且创建对象时,和该类相关的一个类型为Clas

25、s的对象就会自动创建。4.4.1获取类的有关信息nClass类本身不提供构造方法,不能用new运算符和构造方法创建一个Class对象。任何对象调用getClass()方法都可以获取和该对象相关的一个Class对象,这个Class对象调用如下的方法可以获取创建对象的类的有关信息,比如,类的名字、类中的方法名称、成员变量的名称等。常用方法如下所示:qString getName();返回类的名字qConstructor getDeclaredConstructor();返回类的全部构造方法qField getDeclaredFields();返回类的全部成员变量qMethod getDeclare

26、dMethods();返回类的全部方法【例4-9】使用相应的Class对象列出全部成员变量和方法的名称。nimport java.lang.reflect.*;nclass Rect ndouble width,height,area;npublic double getArea()narea=height*width;nreturn area;nnnpublic class ep4_9 npublic static void main(String args)nRect rect=new Rect();nClass cs=rect.getClass();nString className=c

27、s.getName();nConstructor con=cs.getDeclaredConstructors();nField field=cs.getDeclaredFields();nMethod method=cs.getDeclaredMethods();nSystem.out.println(类的名字:+className);nSystem.out.println(类中有如下的成员变量:);nfor(int i=0;i field.length;i+)nSystem.out.println(fieldi.toString();nnSystem.out.println(类中有如下的方

28、法:);nfor(int i=0;i method.length;i+)nSystem.out.println(methodi.toString();nnSystem.out.println(类中有如下的构造方法:);nfor(int i=0;i con.length;i+)nSystem.out.println(coni.toString();nnn4.4.2使用Class实例化一个对象n除了可以通过Class对象获取类的有关信息外,还可以使用Class对象得到一个类的实例。为了得到一个类的对象,先要得到一个和该类相关的Class对象,只要使用Class的类方法:npublic static

29、 Class forName(String className)throw ClassNotFoundExceptionn可以返回一个和参数className指定的类相关的Class对象。再让这个对象Class对象调用:npublic Object newInstance()throw InstantiationException,IllegalAccessExceptionn方法就可以得到一个className类的对象。n需要注意的是,使用Class对象调用newInstance()方法实例化一个className类的对象时,className类必须有无参数的构造方法。【例4-10】使用Cl

30、ass对象得到一个类的对象。nclass RectA ndouble width,height,area;npublic double getArea()narea=height*width;nreturn area;nnnpublic class ep4_10 npublic static void main(String args)ntry nClass cs=Class.forName(RectA);nRectA rect=(RectA)cs.newInstance();nrect.width=100;nrect.height=200;nSystem.out.println(rect的面积+rect.getArea();n catch(Exception e)nnn4.5 练习思考题n1、什么是继承?什么是多重继承和单继承?Java采用何种机制来实现多重继承?n2、什么是隐藏?什么是重写?二者有何区别?n3、子类会继承父类的所有方法和属性么?

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 生活常识

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

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com