《JAVA封装、继承与多态.ppt》由会员分享,可在线阅读,更多相关《JAVA封装、继承与多态.ppt(55页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、2 2学习目标学习目标n理解抽象和封装。n理解继承和多态。n掌握修饰符this和super的使用。3 34.1 4.1 类的封装类的封装n含义:含义:qjavajava中,对象就是一个封装体。中,对象就是一个封装体。q把对象的属性和服务结合成一个把对象的属性和服务结合成一个独立的单位独立的单位,并尽可,并尽可能能隐蔽对象的内部细节隐蔽对象的内部细节(尤其是私有数据)(尤其是私有数据)q目的:使对象以外的部分不能目的:使对象以外的部分不能随意存取对象的内部数随意存取对象的内部数据据(如属性),从而,使软件错误能够局部化,大大(如属性),从而,使软件错误能够局部化,大大减少查错和排错的难度。减少查
2、错和排错的难度。“隐藏属性、方法或实现细节的过程称为隐藏属性、方法或实现细节的过程称为封装封装。”4 4 封装的示例封装的示例有选择地提供数据法拉力公司迪斯尼汽车公司公共电话号码电子邮箱产品种类私有备件的制造方法备件库存备件的制造成本公共电话号码电子邮箱汽车种类私有汽车的组装方法汽车库存汽车的组装成本5 5封装特性封装特性n体现体现:设置对象中的成员变量和方法的访问权限设置对象中的成员变量和方法的访问权限(public,private,protected,public,private,protected,缺省);缺省);:提供一个统一供其他类引用的访问接口,如一些提供一个统一供其他类引用的访问
3、接口,如一些publicpublic方法;方法;:其它对象不能直接修改本对象所拥有的私有属性和私其它对象不能直接修改本对象所拥有的私有属性和私有方法有方法:包:类空间的划分单位包:类空间的划分单位6 64.2 4.2 类的继承类的继承n含义:含义:q子类自动地享用父类中拥有的属性和方法。子类自动地享用父类中拥有的属性和方法。继承的特点具有层次结构子类继承了父类的属性和方法7 7父父 类类 子类子类 父类父类/ /子类子类是相对的是相对的Cow类Lion类Tiger类类Animals类Carnivorous类Herbivorous类Coat类示例示例8 8继承的优点代码的可重用性父类的属性和方法
4、可用于子类设计应用程序变得更加简单可以轻松地自定义子类9 9继承继承n继承是面向对象语言中最具有特色,也是与传继承是面向对象语言中最具有特色,也是与传统最不相同的一个。统最不相同的一个。n当一个类获取另一个类中所有非私有的数据和当一个类获取另一个类中所有非私有的数据和操作的定义作为自己的部分或全部成分时,就操作的定义作为自己的部分或全部成分时,就称为这两个类之间具有继承关系。称为这两个类之间具有继承关系。1010继承继承n例子:请确认各类之间的关系例子:请确认各类之间的关系planeplanemilitary planemilitary plane(军事)军事)passenger plane
5、passenger plane (客机)客机)cargo plane cargo plane (货物)货物)fighter plane fighter plane (战斗机)战斗机)Airliner Airliner (民用机)民用机)1111飞机军事机军事机民用机r战斗机货物机客机1212Public class Employee String name; Date hireDate; Date dateofBirth; String jobTitle int grade; public String getDetails() Public class Manager String name
6、; Date hireDate; Date dateofBirth; String jobTitle int grade; String Department; public String getDetails() public void Guide()1313ContinueContinuePublic class manager extends employee String department; public void Guide()关键字extends 是解决继承问题的1414继承继承n类之间的继承关系是面向对象程序设计语类之间的继承关系是面向对象程序设计语言的基本特征言的基本特征n
7、一个类(子类)是另一个类(父类)的特一个类(子类)是另一个类(父类)的特例。父类是被继承的,子类是继承的例。父类是被继承的,子类是继承的n一般性(父类)和特殊性(子类)一般性(父类)和特殊性(子类)1515ContinueContinuen新类继承一般类的状态和行为,并根据需要增加自己的新类继承一般类的状态和行为,并根据需要增加自己的状态和行为。状态和行为。n由继承而得到的类称为子类由继承而得到的类称为子类(sub class)(sub class),被继承的类,被继承的类称为父类称为父类(super class)(super class)。n父类可以是自己编写的类,也可以父类可以是自己编写的
8、类,也可以JAVAJAVA类库中的类。类库中的类。n利用继承可以有效使用代码的重复使用。利用继承可以有效使用代码的重复使用。nJAVAJAVA不支持多重继承,即子类只能有一个父类。不支持多重继承,即子类只能有一个父类。1616继承的定义继承的定义n子类的成员有一部分是子类自己声明定义的。子类的成员有一部分是子类自己声明定义的。n另一部分是从它的父类继承的。另一部分是从它的父类继承的。n子类继承父类的成员变量作为自己的一个成员子类继承父类的成员变量作为自己的一个成员变量。变量。n继承父类的方法作为自己的方法。继承父类的方法作为自己的方法。1717CONTINUECONTINUEn使用关键字使用关
9、键字extendsextends来声明一个类是另一个类的子类。来声明一个类是另一个类的子类。n格式如下:格式如下:n class class 子类名子类名 extends extends 父类名父类名n例如:例如:n class students extends Peopleclass students extends Peoplen n 1818继承的实现继承的实现 修饰符修饰符class class 类名类名 extends extends 父类父类 成员变量声明成员变量声明; ; 成员方法声明成员方法声明; ; 说明说明:1、子类将自动、子类将自动继承父类中的继承父类中的p ro t e
10、 c t e d 和和public等修饰的等修饰的非私有属性和非私有属性和方法。方法。2、private属性属性和方法不能被和方法不能被继承。继承。u子类中新增加的属性和方法是对父类的子类中新增加的属性和方法是对父类的扩展扩展u子类中定义的与父类同名的属性是对父子类中定义的与父类同名的属性是对父类属性的类属性的隐藏隐藏,同名的方法是对父类方,同名的方法是对父类方法的法的覆盖覆盖19192020继承的继承的JAVAJAVA实现实现class Boxdouble width; double height; double depth;Box() /无参构造函数无参构造函数width = -1; he
11、ight = -1;depth = -1;Box(double w, double h, double d) /有参构造函数有参构造函数width = w; height = h; depth = d; double volume() /计算体积计算体积 return width * height * depth; 2121继承的继承的JAVAJAVA实现实现 class BoxWeight extends Box double weight; BoxWeight(double w, double h, double d, double m) /字类构造函数字类构造函数 width = w;
12、/继承的属性继承的属性height = h; /继承的属性继承的属性depth = d; /继承的属性继承的属性weight = m;/子类特有的属性子类特有的属性 2222继承的继承的JAVAJAVA实现实现 class DemoBoxWeight public static void main(String args) BoxWeight mybox = new BoxWeight(10,20,15,34.3); /初始化子类对象初始化子类对象mybox double vol; vol = mybox.volume(); /调用继承的父类方法调用继承的父类方法 System.out.pri
13、ntln(箱子的体积为:箱子的体积为: + vol); System.out.println(箱子的重量为:箱子的重量为: + mybox.weight); 2323子类使用构造方法子类使用构造方法n子类构造方法总是先调用子类构造方法总是先调用( (显示或隐式地显示或隐式地) )其父其父类的构造方法以创建和初始化子类中的父类成类的构造方法以创建和初始化子类中的父类成员员(super)(super)n构造方法不能被继承构造方法不能被继承, ,它们只属于定义它们的类它们只属于定义它们的类. . n当创建一个子类对象时当创建一个子类对象时, ,子类构造方法首先调用子类构造方法首先调用父类的构造方法并
14、执行父类的构造方法并执行, ,接着才执行子类构造方接着才执行子类构造方法法. .n如果子类如果子类没有没有构造方法,则它构造方法,则它继承继承父类无参父类无参数的构造方法作为自己的构造方法数的构造方法作为自己的构造方法2424构造方法的自动调用构造方法的自动调用n子类继承父类的时候子类继承父类的时候, ,自动调用父类的构造方法自动调用父类的构造方法n 2525CONTINUECONTINUEn如果子类的构造方法没有明显指明使用父类的哪个构造如果子类的构造方法没有明显指明使用父类的哪个构造方法,子类就调用父类的不带参数的构造方法。方法,子类就调用父类的不带参数的构造方法。nSuperSuper关
15、键字可以调用父类的构造方法,但是必须使用关键字可以调用父类的构造方法,但是必须使用在子类的构造方法中,并且只能是第一条语句在子类的构造方法中,并且只能是第一条语句n因此如果在子类的构造方法中,没有使用关键字因此如果在子类的构造方法中,没有使用关键字supersuper调用父类的某个构造方法,那么默认有:调用父类的某个构造方法,那么默认有:super ( )super ( ),即调用父类的不带参数的构造方法。即调用父类的不带参数的构造方法。2626 public class test public class test A a1=new A(); A a1=new A();A a2=new A(
16、3);A a2=new A(3);B b1=new B();B b1=new B();B b2=new B(4);B b2=new B(4); class A class A A()A()System.out.println(1);System.out.println(1); A(int a)A(int a)System.out.println(2);System.out.println(2); class B extends A class B extends AB()B()super(3);super(3);System.out.println(3);System.out.println(
17、3); B(int a)B(int a)System.out.println(4);System.out.println(4); 2727例子例子n编写一个类圆锥继承圆类(上节课完成的类)编写一个类圆锥继承圆类(上节课完成的类)n要求:构造方法要求:构造方法2 2个个n成员方法:求体积和求表面积成员方法:求体积和求表面积2828私有变量是无法继承的x 尽管是不被B继承的,但是B仍旧可以通过继承方法f()来操作x.29293030成员变量隐藏成员变量隐藏n当子类中定义的成员变量只要和父类中的当子类中定义的成员变量只要和父类中的成员变量同名时,子类就隐藏了继承的成成员变量同名时,子类就隐藏了继承的
18、成员变量。员变量。3131n父类中操作的变量仍旧是父类的成员变量父类中操作的变量仍旧是父类的成员变量. .3232方法重写方法重写n子类可以隐藏已继承的方法,子类通过方法重子类可以隐藏已继承的方法,子类通过方法重写来隐藏继承的方法。写来隐藏继承的方法。n方法重写:定义一个方法,并且这个方法的名方法重写:定义一个方法,并且这个方法的名字、返回类型、参数个数和类型与从父类继承字、返回类型、参数个数和类型与从父类继承的方法完全相同。的方法完全相同。n子类通过方法的重写可以把父类的状态和行为子类通过方法的重写可以把父类的状态和行为改变为自身的状态和行为。改变为自身的状态和行为。3333子类继承父类的s
19、peak()方法和cry()方法,但子类通过重写speak()隐藏了继承的speak()方法。在cry方法中调用speak方法,调用的哪一个?34343535SuperSuper操作被隐藏的成员操作被隐藏的成员n如果子类和父类的成员变量同名时,子类就隐藏了从父如果子类和父类的成员变量同名时,子类就隐藏了从父类继承的成员变量。当子类定义一个方法,并且这个方类继承的成员变量。当子类定义一个方法,并且这个方法的名字、返回类型,参数个数和类型与父类的某个方法的名字、返回类型,参数个数和类型与父类的某个方法完全相同是,子类从父类继承的这个方法将隐藏。法完全相同是,子类从父类继承的这个方法将隐藏。n我们要
20、调用父类隐藏的成员,我们可以使用我们要调用父类隐藏的成员,我们可以使用super:super:n super. super.成员变量;成员变量;n super.super.成员方法;成员方法;3636373738383939下列那个选项插入第八行,编译不会通过下列那个选项插入第八行,编译不会通过A.public float getNumreturn 4.0fB.public void getNum()C.public void getNum(double d)D.public void getNum(float d)return 4.0d;4040Resutl?4141以上J_supercla
21、ss中的构造方法,调用mb_add是调用子类的,操作的m_data是父类的。4242finalfinal关键字关键字n可以修饰变量(常量)可以修饰变量(常量)n可以修饰方法可以修饰方法 (不能被重写)(不能被重写)n可以修饰类(不能再被继承)可以修饰类(不能再被继承)434344444545supersupernjavajava中通过中通过supersuper来实现对父类成员的访问,来实现对父类成员的访问,supersuper用来引用当前对象的父类。使用场合:用来引用当前对象的父类。使用场合:q访问父类被隐藏的成员变量,如:访问父类被隐藏的成员变量,如:super.variable super
22、.variable q调用父类中被重写的方法,如:调用父类中被重写的方法,如:super.Method(paramlist); super.Method(paramlist); q调用父类的构造函数调用父类的构造函数 ,如:如:super(paramlist);super(paramlist);4646示示例例47474.3 4.3 类的多态类的多态n多态:是指一个程序中存在着同名不同实现的方多态:是指一个程序中存在着同名不同实现的方法法n作用:作用:q同一接口,不同的实现同一接口,不同的实现n如:如:System.out.println(/System.out.println(/* *各种类
23、型的数据各种类型的数据* */)/)方方法法q进一步隐藏对象内部的实现细节,简化程序设计的复进一步隐藏对象内部的实现细节,简化程序设计的复杂度杂度n表现形式:表现形式:q重载重载:即在同一类中定义:即在同一类中定义多个同名多个同名的不同方法。的不同方法。q覆盖覆盖:子类中对父类方法进行重写(重新定义),但:子类中对父类方法进行重写(重新定义),但具体实现不一样具体实现不一样4848多态性多态性父类子类 - 绘制和移动三角形子类 - 绘制和移动矩形 子类 - 绘制和移动五边形ShapeDraw ()Move ()TriangleDraw () DrawTraingleMove () MoveTr
24、iangleVerticesRectangleDraw () DrawRectangleMove () MoveRectangleCornerPentagonDraw () DrawPentagonMove () MovePentagonVertices4949方法的重载方法的重载 重载是指在同一类中,同一个方法名被定义多重载是指在同一类中,同一个方法名被定义多次,但采用不同的形式参数列表,包括形参的个次,但采用不同的形式参数列表,包括形参的个数、类型、顺序的不同来区分重载的方法。数、类型、顺序的不同来区分重载的方法。 在运行时自动选择正确的方法进行调用称作在运行时自动选择正确的方法进行调用称
25、作动动态绑定态绑定。5050方法的覆盖 Java Java允许子类对父类的同名方法进行重允许子类对父类的同名方法进行重新定义,也就是子类中定义的方法与父类中新定义,也就是子类中定义的方法与父类中已定义的方法名相同,但方法的内容不同,已定义的方法名相同,但方法的内容不同,这种多态就称为这种多态就称为方法覆盖方法覆盖。 由于父类与子类有同名方法,所以在引由于父类与子类有同名方法,所以在引用方法时需要指明引用的是父类的方法还是用方法时需要指明引用的是父类的方法还是子类的方法。子类的方法。5151方法的覆盖n构成条件构成条件q子父类方法同名子父类方法同名q返回类型相同返回类型相同q参数相同参数相同q子
26、类方法的访问权限不能低于父类。子类方法的访问权限不能低于父类。n引用该方法时,自动隐藏父类的该方法,若要引用该方法时,自动隐藏父类的该方法,若要访问,则用访问,则用super.super.方法方法来进行。来进行。5252示例示例 class Square int length;Square(int len)length=len;void getPerimeter()System.out.println(正方形的周长为 +(4* length);class Rectangle extends Square int width;Rectangle(int len,int wid)super(len
27、);width=wid;void getPerimeter()System.out.println(长方形的周长为 +(2* (length+ width); 重写重写5353示例(续)示例(续)public class CalculatePerimeterpublic static void main(String args)Square sqObj=new Square(10);sqObj. getPerimeter();Square rectObj=new Rectangle(10,12);rectObj. getPerimeter();/引用子类的方法5454总结总结 n封装、继承和多态是面向对象的主要特征封装、继承和多态是面向对象的主要特征n继承可提高代码的重用性,使用继承可提高代码的重用性,使用extendsextends关键关键字来实现。除了构造方法之外,父类的所有方字来实现。除了构造方法之外,父类的所有方法和属性都被子类的对象继承法和属性都被子类的对象继承n多态性是不同的实例对象以不同的方式对相同多态性是不同的实例对象以不同的方式对相同的信息作出不同的表现的信息作出不同的表现n访问修饰符用于确定访问类成员的方式访问修饰符用于确定访问类成员的方式结束结束