《继承与多态java程序设计及应用》由会员分享,可在线阅读,更多相关《继承与多态java程序设计及应用(49页珍藏版)》请在金锄头文库上搜索。
1、2019/1/21,第5章 继承与多态,1,第5章 继承与多态,5.1 类的封装 5.2 类的继承 5.3 多态机制 5.4 接口 5.5 包 5.6 内部类 5.7 本章小结 Java程序设计的基本单位是类。类是用来创建对象的模版,它除了把数据和对数据的操作封装成一个整体外,还有另外两个重要的特性:继承和多态。本章的主要内容就是介绍了类的封装、类的继承和与继承有关的多态性、接口及包等重要概念。,2019/1/21,第5章 继承与多态,2,第5章 继承与多态,Java 语言与其他面向对象语言一样,引入了类的概念。Java程序设计的基本单位是类。类是用来创建对象的模版,它包含被创建的对象的属性和
2、功能。类有两种基本的成员:变量和方法,变量用来描述对象的属性,方法用来实现对象的功能。类除了把数据和对数据的操作封装成一个整体外,还有另外两个重要的特性:继承和多态。通过子类可以实现继承。继承是软件复用的一种形式,子类由已存在的父类生成,子类继承父类的属性和功能,并且根据需要对原有的属性和功能加以修改或添加新的属性和功能。而多态是同一个消息可以根据发送消息对象的不同产生多种不同的行为方式。Java通过方法重写、方法重载和接口来实现多态。本章的主要内容就是介绍了类的封装、类的继承和与继承有关的多态性以及接口等重要概念。,2019/1/21,第5章 继承与多态,3,第5章 继承与多态,5.1 类的
3、封装 封装(Encapsulation)是将代码及其处理的数据绑定在一起的一种编程机制。这种机制保证了程序和数据都不受外部干扰且不被误用 Java封装的基本单元是类。 可以阻止外部定义的代码随意访问内部代码和数据 使类或模块的可重用性大为提高 访问权限指本类中的成员可以被哪些类访问 private 私有的 Protected 保护的 Public 公共的 友好,2019/1/21,第5章 继承与多态,4,第5章 继承与多态,5.1 类的封装 类的封装 封装(Encapsulation)是将代码及其处理的数据绑定在一起的一种编程机制。 Java封装的基本单元是类。 可以阻止外部定义的代码随意访问
4、内部代码和数据 使类或模块的可重用性大为提高 需要注意的是,既然类的目的是封装复杂性,在类的内部就应该有隐蔽实现复杂性机制。类中的每个方法或变量都可以被标记为私有(private)或公有(public)。类的公共接口代表类的外部用户需要知道或可以知道的每件事情;私有方法和数据仅能被一个类的成员代码所访问,其他任何不是类的成员的代码都不能访问私有的方法或变量。既然类的私有成员仅能被程序中的其他部分通过该类的公共方法访问,就可以保证不希望发生的事情就一定不会发生。当然,公共接口应该小心仔细设计,不要过多暴露类的内部内容。,2019/1/21,第5章 继承与多态,5,5.1 类的封装,访问权限 访问
5、权限指本类中的成员可以被哪些类访问。类有两种重要的成员:成员变量和方法。这种访问权限控制实现了一定范围内的信息隐藏。 private 私有的 Protected 保护的 Public 公共的 Friendly 友好的,表5.1不同范围的访问权限比较,2019/1/21,第5章 继承与多态,6,5.1.2 访问权限,私有的(private) private privateVar; private privateMethod ( paramlist ) 用关键字Private修饰的成员变量和方法被称为私有变量和私有方法 类中限定为private的成员变量和方法只能被这个类本身的方法访问,不能在类外
6、通过名字来访问。(例5-1) 对于私有成员变量和方法,只有在本类中创建该类的对象时,这个对象才能够访问自己的私有变量和类中的私有方法。(例5-2) 同一个类的不同对象可以访问对方的private 成员变量或调用对方的private方法,这是因为访问保护是控制在类的级别上,而不是对象的级别上。 另外,对于构造方法 ,我们也可以限定它为private。如果一个类的构造方法声明为private,则其他类不能生成该类的一个实例。,2019/1/21,第5章 继承与多态,7,5.1.2 访问权限,保护的(protected) protected protectedVar; protected prote
7、ctedMethod ( paramlist ) 用protected修饰的成员变量和方法被称为受保护的成员变量和受保护的方法。 类中限定为protected的成员可以被这个类本身,它的子类(包括同一个包中以及不同包中的子类)以及同一个包中所有其他的类访问 。 如果一个类有子类,如果都想让子类能够访问自己的某些成员,而不管子类是否与自己在同一个包中,就应该将这些成员声明为 private访问类型。当然也可以将其声明为public。但这样一来,所有的类都能访问,这并不是所希望的。 另外,处在不同包中的子类虽然可以访问父类中限定为 protected的成员,但这时访问这些成员的对象必须具有子类的类
8、型或者是子类的子类的类型,而不能是父类类型 。,2019/1/21,第5章 继承与多态,8,5.1.2 访问权限,公共的(public) public publicVar; public PublicMethod ( paramlist) 用public修饰的成员变量和方法被称为共有变量和共有方法 。 类中限定为public的成员可以被所有的类访问。 public方法的主要用途是让类的客户了解类提供的服务,即类的公共接口,而不必关心类是如何完成其任务的 。,友好的(friendly) 如果在成员变量和方法前不加任何访问权限修饰符,即指明它的访问权限为“friendly”。它是缺省情况。 。 类
9、中限定为“friendly”的成员可以被这个类本身和同一个包中的类所访问。但对包外的所有类就不能访问 。 在源文件中编写命名的类总是在同一包中的。如果源文件使用import语句引入了另外一个包中的类,并用该类创建了一个对象,那么该类的这个对象将不能访问自己的友好变量和友好方法 。,2019/1/21,第5章 继承与多态,9,第五章 继承与多态,5.2 类的继承 继承的概念 继承(Inheritance)是一个对象获得另一个对象的属性的过程 创建子类 通过在类的声明中加入extends子句来创建一个类的子类 this与super Java中,this用来引用当前对象,与this 类似,super
10、用来引用当前对象的父类 继承是面向对象编程技术的一块基石,因为它允许创建分等级层次的类。运用继承,你能够创建一个通用类,它定义了一系列相关项目的一般特性。该类可以被更具体的类继承,每个具体的类都增加一些自己特有的东西。Java中,所有的类都是通过直接或间接地继承java.lang.Object得到的。继承而得到的类为子类,被继承的类为父类,父类包括所有直接或间接被继承的类。子类继承父类的状态和行为,同时也可以修改父类的状态或重载父类的行为,并添加新的状态和行为,Java中不支持多重继承。,2019/1/21,第5章 继承与多态,10,5.2.1 继承的概念,继承(Inheritance)是一个
11、对象获得另一个对象的属性的过程。继承支持了按层分类的概念。大多数知识都可以按层级(即从上到下)分类管理。 通常来讲,类的继承性一个就是新的子类可以从另一个父类派生出来,并自动拥有父类的全部属性和方法。 子类的成员中有一部分是子类自己声明定义的,另一部分是从它的父类继承的。子类继承父类的成员变量作为自己的一个成员变量,就好象它们是在子类中直接声明一样,可以被子类中自己声明的任何实例方法操作。 java是单继承机制,不支持多重继承,即一个父类可以有多个子类,单一个子类只能有一个父类。这种单继承使代码更加可靠,不会出现因多个父类有相同的方法或属性所带来的麻烦。 在Java中所有类都是java.lan
12、g.Object的子类或子孙类。,2019/1/21,第5章 继承与多态,11,5.2.1 继承的概念,继承的规则 子类继承那些被声明为public 或protected的父类成员(包括成员变量和成员方法,下同);(默认的存取权限为friendly) 子类继承那些未被存取权限修饰符修饰的父类成员,只要该子类与父类在同一个包中; 如果子类声明了一个与父类中的成员同名的成员,则子类不继承父类中的该同名成员,即不继承那些被隐藏的成员变量或被重写的成员方法; 子类不继承被修饰为private的父类成员。,2019/1/21,第5章 继承与多态,12,5.2.2 创建子类,通过在类的声明中加入exten
13、ds子句来创建一个类的子类 ,其格式如下: class 子类名 extends 父类名 如果缺省extends子句,则该类为java.lang.Object的子类。例如: class Dog extenda Animal . 子类可以继承父类中访问权限设定为public、protected、friendly的成员变量和方法 。 子类从它的父类中继承了所有的成员变量和方法,但父类中有些成员变量和方法子类不能继承。,2019/1/21,第5章 继承与多态,13,5.2.2 创建子类,子类继承父类的规则 子类能够继承父类中Public和Protected; 子类能够继承父类中没有访问控制的成员,只要
14、子类和父类在同一个包内; 子类不能继承父类隐藏的成员变量和重写的父类方法; 子类不能继承父类中的Private成员; 子类不能继承父类中的构造方法,因为构造方法不是类的成员。,2019/1/21,第5章 继承与多态,14,5.2.3 this与super,子类在隐藏了父类的成员变量或重写了父类的方法后,常常还要用到父类的成员变量,或在重写的方法中使用父类中被重写的方法以简化代码的编写,这时就要访问父类的成员变量或调用父类的方法,Java中通过super来实现对父类成员的访问。 Java中,this用来引用当前对象,与this 类似,super用来引用当前对象的父类。 关键字this 和supe
15、r分别用来指明子类和父类中同名的成员变量或成员方法 当父类的成员变量、子类的成员变量和类中方法使用的局部变量三者同名,或其中的两者同名时,可以使用关键字this和super来指定所要使用的变量。,2019/1/21,第5章 继承与多态,15,5.2.3 this与super,This this可以出现在实例方法和构造方法中,但不可以出现在类方法中。这是因为类方法可以通过类名直接调用,这时可能还没有任何对象诞生。 在构造方法中使用this 关键字 this可以出现在类的构造方法中,代表使用该构造方法所创建的对象。(例5-3) 在实例方法中使用this 关键字this可以出现在类的实例方法中,代表
16、使用该方法的当前对象。实例方法可以操作成员变量。当成员变量在实例中出现时,默认的格式是:this.成员变量;意思是当前对象的成员变量,2019/1/21,第5章 继承与多态,16,5.2.3 this与super,Super super的使用有三种情况 用来访问父类被隐藏的成员变量,如:super.成员变量; 用来调用父类中被重写的方法,如:super.方法 (参数列表t); 用来调用父类的构造方法,如:super(参数列表); (例5-4,例5-5),2019/1/21,第5章 继承与多态,17,5.3 多态机制,5.3 多态机制 多态性(Polymorphism)是指同名的不同方法在程序中共存。即为同一个方法定义几个版本,运行时根据不同情况执行不同的版本。调用者只需使用同一个方法,系统就会根据不同的情况,调用相应的不同方法,系统会根据不同情况,调用相应的不同功能。多态又被称为“一个名字,多个方法”。 方法的重载 (overload) 一个类中可以有多个具有相同名字的方法,由传递给它们的不同个数