类、继承与多态讲义

上传人:我** 文档编号:113788899 上传时间:2019-11-09 格式:PPT 页数:76 大小:1.06MB
返回 下载 相关 举报
类、继承与多态讲义_第1页
第1页 / 共76页
类、继承与多态讲义_第2页
第2页 / 共76页
类、继承与多态讲义_第3页
第3页 / 共76页
类、继承与多态讲义_第4页
第4页 / 共76页
类、继承与多态讲义_第5页
第5页 / 共76页
点击查看更多>>
资源描述

《类、继承与多态讲义》由会员分享,可在线阅读,更多相关《类、继承与多态讲义(76页珍藏版)》请在金锄头文库上搜索。

1、2019/11/10,在面向对象程序设计中,继承是最为显著的一个特征。继承 机制模仿了现实中IS-A关系(层次关系) .继承就是以原有某个类 为基础生成新的类,增加一些新的成员变量和方法,使新的类 功能更趋完善的一种高效编程机制。新生成的类被称为子类(或 派生类),原有的这个类被称为子类的父类(基类,也称为超类). 通常把某一组相似对象的基础的、共有的、通用的属性设计成父类,再通过继承生成新的子类,代码重用性得到了提高. 例如, 水果和梨, 动物和乌龟, 食品和罐头, 交通工具和轿车等 注意,Java顶层父类是Object.,3.2 继承,2019/11/10,类的定义语法是: 修饰符 cla

2、ss 类名 extends 父类 implements 接口名 类成员变量定义 类方法定义 ,类的修饰符用来说明类的特殊性质。分为三种: 访问控制符:public 或 无 抽象类说明符:abstract 最终类说明符:final,接口名跟在implements关键字后面,用来说明当前类中实现了哪个接口定义的功能和方法。 接口是Java语言用来实现多重继承的一种特殊机制。,3.2.1 类的定义,2019/11/10,如定义一个Person类和子类Student class Person String name; int age; public void eat() public void sle

3、ep() class Student extends Person private String shoolNO; private void doHomework(); ,2019/11/10,3.2.2 成员变量和方法 成员变量用来描述类创建的对象的属性,而成员方法则刻画 了对象特有的行为。 Java中的成员变量根据不同的修饰符有3种类型: -实例变量,随对象被访问 -类变量,随类被访问 -常量 注意,Java成员变量随对象被创建而产生,对于全局静态变 量,则与类属于同等层次概念。,2019/11/10,举例说明,见【例3.3】,2019/11/10,就对象的方法而言,可分为构造方法和普通方

4、法。而构造方法是在类创建对象时由系统自动调用。 与成员变量一样,方法也有实例方法和类方法之分。 -实例方法,随对象而调用 -类方法,随类而调用 方法的定义语法是: 修饰符 返回值 (参数列表) 方法体 其中,修饰符共4种情况: public, protected, private 或 不提供.,2019/11/10,要使用对象,必须先创建对象。Java中的对象是通过构造 方法来创建的。构造方法有以下特性: 构造方法的方法名与类名相同。 构造方法没有返回值,当然也没有返回类型。 构造方法的主要作用是完成对类对象的初始化工作。 构造方法一般不能由编程人员显式地直接调用。 在创建一个类的新对象的同时

5、,系统会自动调用该类的构造方法,为新对象初始化。 一个类可以有多个构造方法,可以有0个、1个或多个参数。 构造方法总是和new运算符一起被调用。,3.2.3 对象的构造和初始化过程 *!*,2019/11/10,当没有为类提供一个构造方法时,则编译器会自动加入一个不带参数的构造方法,称为默认构造方法。例如, class Person Person() super(); class Student extends Person Student () super(); /系统自动行为 public static void main(String args) new Student(); /(1)

6、创建子类对象 问题,上述语句(1)会不会创建父类对象? 要注意区分构造方法和new操作的不同作用!,class Object Object () ,2019/11/10,构造方法的执行过程 当创建一个对象时,对象的各个变量根据其类型被设置为 相应的默认初始值,然后调用构造方法。下面是执行步骤: 调用父类的构造方法,这个过程会重复下去. 按声明顺序对成员变量进行初始化. 执行构造方法中的各语句. 构造器调用的顺序保证所有的父类构造方法都得到调用,保证其基类的成员得到正确的初始化并执行相关语句,然后对本对象的域(变量)进行初始化。构造方法的作用就是初始化. 下面举例说明.,【例3.1】 构造方法和

7、对象初始化,2019/11/10,程序运行结果是:? 下面,将对继承情况下父-子类之间的初始化进行分析.,2019/11/10,public class aparent int height=170; int weight; aparent( ) height=160; weight=130; class aboy extends aparent protected int comhei=120; aboy( ) weight=(int)(120f/height*weight); 当创建 一个类型为aboy的对象时,其创建和初始化的步骤 如下表所示。,例如,创建一个子类对象时,2019/11/

8、10,2019/11/10,Java的类加载过程和对象初始化顺序,按照如下步骤进行: 首先,当类被加载时执行静态变量初始化、静态初始化块. 然后,非静态变量初始化、非静态初始化块被执行. 最后,构造方法被执行。从父类的构造方法递归执行. 即,依次执行: (静态变量、静态初始化块) (变量、初始化块) 构造方法,2019/11/10,注意, (1)在继承情况下,并不是父类完全初始化完毕后才进行子类 的初始化! (2)静态变量和静态初始化块是依照他们在类中的定义顺序进行初始化的。同样,变量和初始化块也遵循这个规律. 下面举例说明.,【例3.2】 类加载和对象初始化,2019/11/10,3.2.4

9、 上转型对象 梨子-水果,乌龟-动物,学生-人等概念具有从属关系,前者 是后者的一种。 例如,对于Person类和子类Student;当创建Student子类 对象时,并把这个对象的引用放到类Person声明的对象 中,即: Person p= new Student(); 或者 Person p; Student s= new Student(); p =s ; 则称 对象p是子类对象s的上转型对象. 类似地, 也可以将创建的间接子类 Graduate对象放到 Person对象引用中。 对象的上转型对象的实体是子类负责创建的,只是失去了原对象的一些属性和方法,其特点如图所示:,2019/11

10、/10,原对象和上转型对象之间关系 上转型对象的特点是: a. 上转型对象不能操作子类新增的变量和方法. b. 上转型对象可以操作子类继承或隐藏的成员变量,也可以使 用子类继承或重写的方法. c. 可将上转型对象再转换到一个子类对象,这时该子类对象又 具备了子类的所有属性和功能.,【例3.3】 上转型对象,2019/11/10,上转型对象应用举例.,问题: 下列语句正确吗? Student s= new Person(); 上转型对象是父类对象吗?,2019/11/10,3.2.5 this和super this, super分别指代当前对象和父类对象,通常出现在构造 方法中。例如, clas

11、s Person String name=“zhangshan”; public Person () /super (name); /显式调用父类带参的构造方法 this (name); /调用重载的构造方法, Person (name) ? public Person(String name) this.name =name; /为同名的成员变量赋值 ,2019/11/10,注意以下几点: 1) 在一个构造方法中使用了this或super语句,那么它必须作为构造方法的第一条语句. 2)只能在构造方法(非其他实例方法)中用this语句来调用类的其他构造方法,且不能通过方法名来直接调用构造方法.

12、如果调用父类构造方法也只能用super而不是父类名. 3) this, super对象不能出现在静态方法中. public static void main(String args) this.play(); / ,2019/11/10,3.3 多态,多态是指一个名称具有多种功能。即同名但拥有不同的方法体。分重载(overloading)和覆盖(overriding)两种。 重载,又称编译时多态,在一个类中通过不同参数个数或不同类型参数来体现。如: sum (byte a, byte b); sum (int a, int b); sum (double a, double b); ,2019

13、/11/10,构造方法的重载 构造方法重载的目的是以不同的方法对类进行初始化。例如, 为类Person编写构造方法: public Person () public Person (String name) public Person (int ID) public Person (String name, String ID) 为Student子类编写构造方法: public Student () public Student (String name, String no) 如果构造方法有返回值类型(包括void)修饰,那它不再是构造方法而成了普通方法,一般不提倡这么做。,构造方法可以被继

14、承吗? 可以用static修饰吗?,2019/11/10,方法覆盖,又称运行时多态,只有在运行时(非编译时)根据对象的类型来决定是调用父类的同名方法还是子类重写的方法。例如, 狗叫,猫叫,老虎叫,狮子叫声都不一样! 方法覆盖条件: 1) 方法名相同; 2) 方法的参数列表完全相同; 3) 返回值必须相同; 举例说明如下:,方法的访问修饰符有影响吗? 对照想一想,方法重载的条件呢?,【例3.4】 方法重载,2019/11/10,【例3.5】 方法覆盖,2019/11/10,下面修改一下上述main方法中的几个语句,如上图所示,则运行结果呢?,Animal a= new Animal(); Ani

15、mal c =new Cat(); Animal d= new Dog(); a.sound(); c.sound(); d.sound();,2019/11/10,关于方法覆盖(重写),Java运行时系统根据调用该方法的对象,来决定调用哪个方法。对于子类的一个对象,如果子类重写了父类的方法,则运行时系统调用子类的方法;如果子类继承了父类的方法(未重写),则运行时系统调用父类的方法。 private方法可以被覆盖吗?final方法可以被覆盖吗? 注意,方法覆盖还存在访问权限的问题。,2019/11/10,变量覆盖 或称变量隐藏,只要变量名相同就实现了隐藏。其修饰符和类型可以不同。 例如,,问题

16、,这样赋值可以吗? woman.aveHight= 170.5f;,2019/11/10,3.4 修饰符,3.4.1 访问修饰符 在定义类,成员变量,方法时,可以在其前面加上修饰符。有访问修饰符和非访问修饰符之分。 访问修饰符 是一组限定类,成员变量或方法能在多大范围内被访问的修饰符。 类的访问修饰符只有两种,而成员变量和方法可以拥有4种不同的修饰符.如图所示:,2019/11/10,2019/11/10,(1)公共访问修饰符-public,用来修饰类时,即公有类,表明它可以被所有的其他类所访问和引用. 这里访问和引用是指这个类作为整体是可见和可使用的,可以创建这个类的对象、访问这个类内部可见的成员变量和调用

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

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号