您好,欢迎访问三七文档
1第5章深入类主要任务:介绍类的继承性和多态性,以及一些相关问题。2本章主要内容1.类的继承性2.类的多态性3.接口4.包35.1类的继承性什么是类的继承?–在已有类的基础上添加新的特性(属性和方法)可以生成一个新的概念描述,这种现象称为类的继承。45.1.1父类和子类1.基类(父类)和派生类(子类):–是继承关系中的两类主体;–子类继承了父类的信息,即子类拥有父类的所有成员,除此之外还可以在子类中加入新的成员信息。2.Java中的继承:–java只支持单继承,即一个子类只能继承自一个直接父类;一个父类可以派生出多个子类。–Java的继承机制使所有类构成了一个层次结构;Java提供了一个名为Object的特殊类,所有的类都直接或间接地继承自该类。5…CalendarIntegerShort…GregorianCalendar自定义Calendar子类ObjectNumberString自定义类63.子类的声明格式:[修饰词]class子类名extends父类名{}Animal+Stringspecies+StringtoString()AnimalDog-Stringbreed+StringgetBreed()+voidsetBreed()7classAnimal{publicStringspecies;publicStringtoString(){return“species:”+species;}……}classDogextendsAnimal{privateStringbreed;publicvoidsetBreed(Stringbreed){this.breed=breed;}publicStringgetBreed(){returnbreed;}}classDog{publicStringspecies;privateStringbreed;publicStringtoString(){……}publicvoidsetBreed(Stringbreed){……}publicStringgetBreed(){……}}相当于8为何引入继承机制?–代码复用:定义子类时,不用对父类中的属性和方法进行重复定义、说明;–为子类提供了统一的结构,便于分析和使用。95.1.2成员变量的继承和隐藏1、成员变量的继承:–子类拥有父类所有的成员变量2、成员变量的隐藏:–在子类中可以新加和父类成员同名的成员,此时父类中对应的成员将被覆盖;–父类成员的访问权限修饰决定了该成员在子类中的访问权限。10•父类的私有成员在子类新增加的方法中不能被直接访问;•父类的protected和public成员在子类中的访问属性不变,可以在子类中直接访问这两类的成员变量和方法。115.1.3成员方法的覆盖已知通过继承子类可以继承父类中所有可以被子类访问的成员方法;如果继承来的成员方法在子类中有不同的实现方式,此时可以重写成员方法的方法体,此种行为称为成员方法的覆盖/重写。12一个有关几何图元处理的例子任何一个几何图元都有颜色和原点这两个基本属性。矩形是一种图元,它还有长(long)、宽(width)两个属性,正方形是一种特殊的矩形,它的特殊性在于长和宽相等。从该问题域中可以提取三个类,其间关系可以用图所示的UML图描述:ShapeRectangleSquare13Shape-Colorcolor-Pointorigin+voidsetColor()+ColorgetColor()+PointgetOrigin()+voidsetOrigin()ShapeRectangle-intlong-intwidth+intgetLong()+intgetWidth()+voidsetLong()+voidsetWidth()+intgetArea()+intgetPermeter()RectangleSquare+voidsetLong()+voidsetWidth()需要重写Square类中的setLong、setWidth方法!14方法重写时要需注意:–用来覆盖的子类方法应和被覆盖的父类方法保持同名、同返回值类型,以及相同的参数个数和参数类型。–父类中用final修饰的成员方法不能被子类重写。15–重载:在一个类及其子类中,同一个名称的成员方法被定义多次的现象称为方法的重载;–方法重载的前提:多个同名方法的参数个数或参数类型互不相同;如:intmax(inta,intb){……}doublemax(doublea,doubleb){……}intmax(inta,intb,intc){……}程序运行时,系统会根据方法调用时实际参数的类型和个数执行确定的方法。–重载的意义:重载机制统一了类的对外接口,从而增强了程序的可扩展性。155.1.4成员方法的重载16构造方法的重载:可以为类定义多个参数个数或类型不同的构造方法;重载构造方法的目的:为类提供多种初始化对象的能力,使程序员可以根据实际需要选用合适的构造方法来初始化对象。17例5.6构造方法的重载。运行结果如图所示:18classRunDemo{privateStringuserName,password;RunDemo(){System.out.println(Allisnull!);}RunDemo(Stringname){userName=name;}RunDemo(Stringname,Stringpwd){this(name);password=pwd;check();}19voidcheck(){Strings=null;if(userName!=null)s=用户名:+userName;elses=用户名不能为空!;if(password!=ThisWord)s=s+口令无效!;elses=s+口令:********;System.out.println(s);}}20publicclassD1{publicstaticvoidmain(String[]args){newRunDemo();newRunDemo(Bill);newRunDemo(null,Bill);newRunDemo(Bill,ThisWord);}}225.1.5this、super和super()(1)this:在非静态成员方法的定义中可以使用this关键字,表示对当前使用该方法的对象的引用。classPoint{intx,y;Point(intx,inty){this.x=x;this.y=y;}}classTestPoint{publicstaticvoidmain(){Pointp1=newPoint(1,2);Pointp2=newPoint(5,7);}}23(2)super:就像this关键字是自身对象的引用一样,super关键字是父类对象的引用,在子类中可以通过super关键字访问被子类覆盖的成员。super.父类成员变量名super.父类成员方法名([实参])24--------------------------------------------classPerson{protectedStringname;publicStringtoString(){returnName:+name;}}classStudentextendsPerson{protectedStringschool;publicStringtoString(){returnsuper.toString()+\nschool:+school;}//通过super关键字可以访问基类被覆盖的成员}25(3)super()可用来调用父类的构造方法。是唯一由程序员间接调用类的构造方法的途径,因为Java规定类的构造方法只能由new操作符调用,程序员不能直接调用。同理,this()也可用来间接调用当前类或对象的构造方法。26classParent{privateinta,b;publicParent(){a=b=1;}publicParent(int_a,int_b){a=_a;b=_b;}}classChildextendsParent{publicintc,d;publicChild(){c=d=2;}publicChild(int_a,int_b,int_c,int_d){super(_a,_b);c=_c;d=_d;}}271、向上转型:–向上转型可以理解为是子类对象到父类对象的类型转换;–由于子类是父类的一个特例,所以可以说子类对象就是一个父类的特殊对象,如:“Student是Person”,即一个Student类的对象也是一个Person类的对象。classTest{publicstaticvoidmain(String[]args){Personp1=newPerson();p1.printName();Students1=newStudent();s1.printName();Personp2=newStudent();p2.printName();}}5.2类的多态281、向上转型:–只有存在继承关系的类的对象之间可以使用向上转型机制;–在将子类对象赋给父类引用时,不能通过声明的父类对象名访问其子类对象的新增成员。classPerson{privateStringname;voidsetName(Stringname){this.name=name;}StringgetName(){returnname;}voidprintName(){System.out.println(“姓名:”+name);}}classStudentextendsPerson{publicstaticStringschool;voidprintSchool(){System.out.println(“学校:”+school);}}PublicclassTest{publicstaticvoidmain(){Personp=newStudent();p.setName(“Bill”);p.printName();p.printSchool();}}?29classA{voidfunction(){System.out.println(“Afunction”);}}classBextendsA{voidfunction(){System.out.println(“Bfunction”);}}classTest{publicstaticvoidmain(String[]args){Aa=newB();a.function();}}?302、多态–当子类重写了父类的某些方法,则在进行对象的向上转型时,系统会根据运行时创建的实际对象调用确切的方法。312、多态:–对同一个类的多个对象传递同一个消息,却可能得到不同响应的现象被称为多态性。–Java从下面几个方面支持多态机制:•支持成员方法的重载(overload)和覆盖(override);•支持对象向上转型;–多态的优势:使程序具有良好的可扩展性;当基类派生出新类型时,可以通过基类的统一公共接口实现消息传递,使得类的使用者无需修改应用代码。32练习:模拟老虎捕食。老虎可以捕食羊、野兔、野猪,它们被捕捉后会发出惨叫声。Goat+scream()Hare+scream()Boar+scream()老虎还可以捕食狐狸,狐狸被捕捉后也会发出惨叫声。Animal+scream()Tiger+catches(?)Tiger+catches(Animal)Tiger+catches(Goat)+catches(Hare)+catches(Boar)335.3接口什么是接口?–所谓接口可以看作是没有实现的方法和常量的集合;–接口与抽象类相似,是一个“纯”抽象类;接口中的方法都是抽象方法。接口的作用?–有些概念之间并没有继承关系,但是有着共同的行为属性,这时可以将共同行为进行提炼,以接口的形式进行描述;这样统一了对外接口,方便外界与之进行消息传递。34保险公司的例子–具有车辆保险、人员保险、
本文标题:第5章深入类.
链接地址:https://www.777doc.com/doc-2110546 .html