Java程序设计第6章 继承与多态
Java-第06章-继承和多态8.30

public class Magnician { private String name;//角色名称 private int level;//角色等级 private int blood;//角色血量 public void fight() { System.out.println("魔法攻击"); }
public void fight() { System.out.println("挥剑攻击"); } public int getBlood(){ return blood; } public void setBlood(int blood){ this.blood=blood; } public int getLevel(){ return level; } public void setLevel(int level){ this.level=level; } public String getName(){ return name; } public void setName(String name){ =name; } }
public class SwordMan extends Role{
public String toString(){ return String.format("剑士(%s,%d,%d)", , this.level,this.blood);
public static void main(String[] args) {
注意:父类的private成员会被继承,只是子类 无法直接存取,必须通过父类提供的方法来存 取。
6.1.2 多态与is-a Java继承的特点:子类只能继承一个父类。 子类和父类是is-a关系。Swordman is a Role,Magicial is a Role。这是理解多态的基础
Java语言06(继承和多态)

方法的覆盖
1.
子类方法对父类同名方法的覆盖将清除父 类方法占用的内存空间,从而使父类方法 在子类对象中不复存在。 方法覆盖中需要注意:子类在重新定义父 类已有的方法时,应保持与父类完全相同 的方法头声明,即应与父类有完全相同的 方法名、返回值和参数列表。
2.
public class MethodOverride{ MethodOverride{ public static void main(String [] args) { args) SubClass s=new SubClass(); SubClass(); s.fun(); }} class SuperClass{ SuperClass{ int i=1; public void fun() { System.out.println("Super"); System.out.println("Super"); System.out.println("父类的i "+i System.out.println("父类的i="+i); }} class SubClass extends SuperClass{ SuperClass{ int i=2; public void fun() { System.out.println("Sub"); System.out.println("Sub"); System.out.println("子类的i="+i System.out.println("子类的i="+i); System.out.println("父类的i="+super.i); System.out.println("父类的i="+super.i); }}
Java编程基础及应用(第2版)教学课件第6章 类的继承与多态性

6.1.1 引言
下图为一个继承的实例:
6.1.2 继承的概念
• 继承是从巳有的类中派生出新的类,新的类拥有已有 类的数据属性 和行为,并能扩展新的数据属性和行为。换句话说,继承就是在已经 存在的类的基础上再扩展新的类。
• 已经存在的类称为父类、超类或者基类。新产生的类称为子类或派生 类。子类拥有父类的所有特性。当然,也可以在子类中添加新的方法 和成员变量,这些新添加 的方法和成员支量仅仅属于子类。
• 继承分为单继承和多继承。单继承是指一个子类最多只能有一个父类 。多继承是指一个子类可以有两人以上的父类。由于多继承会带来二 义性,在实际应用中应尽 量使用单继承。
6.1.3 继承的实现
■关键字(extends)
继承通过关键字extends实现。如果使用默认的extends子句,则该
类为ng.Object的子类。子类可以继承父类中访问权限为public、
■继承的特点: (1) 提供多继承机制。从理论上说,一个类可以是多个一般类的子类,它
可以从密个一般类中继承属性与方法,这便是多继承。Java出于安全性和 可靠性的考虑,仅支持单继承,而使用接口机制来实现多继承。
(2) 继承通过增强一致性来减少模块间的接口和界面, 大大增加了程序 的易维护性。
6.1.5 继承的特点与优点
Child c = new Child(); System.out.println(c.add(4,"3")); }
6.2.2 方法覆盖和重载
■方法重载:是指在同一个类中,定义多个名称相同,但参数个数或 类型不同的方法,程序中的对象根据参数的个数或者类型,调 用相对应的方法。
■例:StudentOverload类定义构造函数和get()方法,并重载了这两个方 法,sol、so2对象根据这两个方法的参数个数或类型调用相应的 方法。
Java基础课程06-第六章 继承和多态

动物 谁是父类? 谁是子类? 能说出继承的特点吗?
食草动物
食肉动物
继承需要符合的关系:is-a,父类更通用、子类更具体
5
生活中的继承
• 子类具有父类的一般特性(包括属性和行为),以及自身 特殊的特性
巴士是汽车吗? 卡车是汽车吗? 出租车是汽车吗?
汽车 引擎数量 外观颜色 刹车 加速 属性 行为
第21页
多态
Java语言允许某个类型的引用变量引用子类的实例,而且可以对这个引用变量进
行类型转换 Animal animal = new Dog(); Dog dog = (Dog)animal; //向下转型,把Animal类型转化为Dog类型 Creature creature = animal; //向上转型,把Animal类型转化为Creature类型 如果把引用变量转换为子类类型,称为向下转型, 如果把引用变量转换为父类类型,称为向上转型。 在进行引用变量的类型转换时,会受到各种限制。而且 在通过引用变量访问它所引用的实例的静态属性、静态方法 Animal
访问 用static 修饰的成员方法表示静态方法,可以直接通过类名来 访问 用static修饰的程序代码块表示静态代码块,当java虚拟机加载 类时,就会执行该代码块
final关键字
• 修饰类 – 不能被继承 • 修饰方法 – 不能被子类重写
• 修饰变量
– 只能在赋值或构造函数中赋值,后期不能进行修改 • 修饰方法参数 – 如果方法参数是基本类型,那方法中不能修改该值 – 如果方法参数是引用类型,那方法中不能修改该对象的地址
由于giveLesson()方法与父 类的实现有所不同,因此 重写了该方法
12
JAVA课程第六章 继承和多态

任务6-4:子类与父类方法同名
public class Student{ String name;//姓名 int No;//学号 String Info(){ return "姓名:"+name+"\t学号:"+No; } }
public class onJobStudent extends Student{ String title ;//职称 String company;//所在单位 String Info(){ return "姓名:"+name+" \t学号:"+No + "\n职称:"+title+"\t单位:"+company; } }
姓名:张三 职称:工程师 学号:20081002 单位:广州宝杰公司
任务6-3
Student类 name no address
任务6-4
Student类 name no Info()
继承
onJobStudent类 name no address //重新定义
继承
onJobStudent类 name no
继承
circle类 x 继承 y radius double area() 在test类的Main函数中 double perimeter() 生成两个点
一个圆 一个圆柱
public class Student{ 任务6-3:子类与父类变量同名 String name;//姓名 int No;//学号 String address="广州精英学院";//学校地址 String Info(){ return "姓名:"+name+" 学号:"+No; } } //子类对父类同名变量的覆盖 public class onJobStudent extends Student { String company;//工作单位 String title; //职称 String address="广州工业大道1001号";// 单位地址 void printAddress() { System.out.println("单位地址:" + address); } }
java继承与多态

java继承与多态继承继承:可以让⼦类继承⽗类,这样⼦类会继承⽗类所有的属性和⽅法。
然⽽在Java中是不允许有多继承的,即⼀个⼦类只能继承⼀个⽗类,不能同时继承多个⽗类。
如果⼀个类还需要另外⼀个类的⽅法,可以让⽗类去继承需要的类。
但Java中⽀持多重继承,即⼀个⼦类也可以做为其他类的⽗类。
Object类:是Java中的祖宗类,当⼀个类在代码层⾯没有去继承任何的⽗类,那这个类默认会继承object类。
继承的重写(覆盖):⼦类继承⽗类以后,可以获取到⽗类的所有⽅法(包含被private修饰的⽅法,只是访问不到),如果⽗类的⽅法功能不能满⾜⼦类的需求,那么⼦类可以根据需求对这个⽅法进⾏重写。
Super关键字:⼦类继承⽗类后,⼦类可以通过super关键字去指向⽗类的元素(属性,构造⽅法,普通⽅法)。
如果是指向⽗类的构造⽅法:super()如果是指向⼦类的构造⽅法:this()注:像super(),this()这样的表达式只能存在于构造⽅法中,且只能出现⼀次。
如果是指向⽗类的普通⽅法:super.⽅法名称()如果是指向⽗类的属性:super.属性名称()构造⽅法的继承:在继承时,当⼦类⽤到默认的⽆参构造⽅法时,⽗类必须要有⽆参构造⽅法,不然⼦类的构造⽅法就会报错。
因为⼦类继承⽗类之后,获取到了⽗类的内容(属性/字段),⽽这些内容在使⽤之前必须先初始化,⼦类如果在没有⾃定义构造⽅法的情况下默认会有⼀个⽆参构造⽅法,其中第⼀⾏默认会有⼀个super(),所以必须先调⽤⽗类的构造函数进⾏内容的初始化。
所以⽗类必须要有⼀个⽆参构造⽅法。
⼦类直接继承得到的属性⽆法直接获取,可以通过⽗类的get和set⽅法来获取和修改属性。
public class Animal {private String name;private int age;private String hobby;public Animal(){}public Animal(String name, int age, String hobby) { = name;this.age = age;this.hobby = hobby;}}public class Dog extends Animal {public Dog(String name, int age, String hobby) {super(name, age, hobby);}}⽅法重写与⽅法重载的区别:⽅法重写override:⽅法重写是指⼦类在继承了⽗类之后需要对⽗类的⼀些⽅法进⾏修改,以适应程序需求,因此在⼦类中重写⽗类中原有的⽅法。
java 第六章 继承与多态

6.2.4方法参数和异类集合
1 方法的参数 为了处理的一般性,实例和变量并不 总是属于同一类
public TaxRate findTaxRate(Employee e) { // 进行计算并返回e的税率 findTaxRate() 的 自 变 量 必 须 是 Employee 类 型 } 的,而调用时的参数是 // 而在应用程序类中可以写下面的语句 Manager 类 型 的 , 但 因 为 Manager 是 一 个 Manager m = new Manager(); Employee,所以可以使 用更“一般”的变量类型 TaxRate t = findTaxRate(m); 来调用这个方法。
Object Employee
Manager
Contractor
instanceof运算符 类的变量既可以指向 本类实例,又可以指 向其子类的实例。可 以通过instanceof运算 符判明一个引用到底 指向哪个实例
public void method(Employee e) { if (e instanceof Manager) { // 经理级人士 } else if (e instanceof Contractor){ // 掌握公司机密的高层人 士 } else { // 普通雇员 } }
extends关键字
public class A extends B
public class Employee { public class Manager extends Employee{ private String name; private String department; private Employee [] subordinates; private Date hireDate; ... private Date dateOfBirth; } private String jobTitle; private int grade; } Words.java
Java第6讲 继承与多态

}
}
类的继承和派生
定义一个Fish类
鱼本身也是动物,它也有吃、睡觉、呼吸行为, 希望它从动物类继承状态和行为。
class { } Fish extends Animal
替换(向上转型)
二、替换
考察父类的类型与子类的类型之间关系,发现: 子类实例必须拥有父类的所有数据成员。 子类实例必须至少通过继承,实现父类所定义的所 有功能。 这样,在某种条件下,如果用子类实例替换父类实例 将会发现子类实例可以完全模拟父类的行为。
继承图
被继承数据 (private) 被继承数据 (public和protected)
基类A
从基类继承数据 (除private在B中不可见,其它都可见) 自己新增加部分
派生类B
类的继承访问特性
基类中的private成员在派生类中都是不可见的,即该 派生类的方法成员不能直接访问基类中的私有成员。
public class A { private int m_a; public int m_b; protected int m_c; public A() { m_a=3; m_b=4; m_c=5; } public int getA() { return m_a; } } public class B extends A { public void showData() { //error System.out.println(m_a); //ok System.out.println(m_b); System.out.println(m_c); //ok System.out.println(GetA()); } }
class { Fish extends Animal public void breathe() { System.out.println(“fish bubble”); } }
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
6.2.3 super关键字 super表示当前类的直接父类。 在有些情况下,还想访问被子类隐藏的域或被重写的方法,这种情况下 则可以通过关键字super实现相应的访问。
如果想明确地访问继承自父类中的域,可以通过下面形式访问:
super.域名
表示访问当前类直接父类中的域。如果想明确地调用继承自父类中的 方法,可以通过下面形式访问:
要,这种情况称为方法的重写。
子类中定义的域的名字与继承自父类的域的名字相同,则在子类中隐
藏了继承自父类的域,子类中的方法不能访问父类中的被隐藏的域。
【例6.3】域隐藏举例。
Example6_03.java
6.2.2 方法的重写
当子类继承父类的方法后,子 类根据自身的需要可以对继承的方 法重新定义,以便使子类对象表现
super.方法名([实际参数])
super还可以用于调用直接父类的构造方法:
super([实际参数]);
6.2.3 super关键字 调用父类的构造方法有如下的规则: 在构造子类对象时,父类的构造方法一定会被调用; 如果子类的构造方法使用了super调用父类的构造方法,则按给定的参数 调用父类中相应的构造方法; 如果在子类的构造方法中没有使用super调用父类的构造方法,则父类中 的没有参数的构造方法会被自动调用。 如果子类没有使用super调用父类构造方法并且父类中也没有定义没有参 数的构造方法,则编译不能通过。
第
6
章
继 承 与 多 态
Java程序设计
CONTENTS
目录
6.1 子类及其对象 6.2 域的隐藏和方法的重写
6.3 对象的赋值兼容规则
6.4 final关键字 6.5 多态 6.6 abstract关键字 6.7 小结
6.1.1 子类定义 子类定义实际上就是定义类的过程,只不过是在父类的基础TS
目录
6.1 子类及其对象 6.2 域的隐藏和方法的重写
6.3 对象的赋值兼容规则
6.4 final关键字 6.5 多态 6.6 abstract关键字 6.7 小结
积和周长,能够对圆进行平移。定义圆类的对象并进行相应的操作,输出操
作后的结果。Example6_01.java
6.1.3 instanceof运算符
instanceof运算符用于判断一个对象是否是某一个类的实例对象,或者 是否是某一个类的子类的实例对象。 instanceof的方法形式:
对象名 instanceof 类名
【例6.4】某公司给雇员发工资。雇员中 有经理、技术人员和一般雇员,该公司 给雇员定的工资标准是:一般雇员工资 领固定工资,经理工资在一般雇员工资 基础上加本月津贴,技术人员的工资在 一般雇员工资基础上加技术津贴,技术
出与父类不同的行为。这种重新定
义的过程称方法的重写
(Override)。
津贴为工作小时数×单位津贴/小时。
将上转型对象转换为子类对象称为下转型对象。
6.3 对象的赋值兼容规则 当用一个父类对象表示子类对象后,父类对象: 可以访问子类继承自父类的域或被子类隐藏的域; 可以调用子类继承自父类的方法或被子类重写的方法; 不能访问子类相对于父类新增加的域或方法。 所以,通过父类访问的域或方法一定是继承自父类的域或方法、或者是 隐藏继承自父类的域、或者是重写继承自父类的方法。 使用赋值兼容规则主要是为了实现多态性。
父类与子类在同一个包中,则父类中的友好成员可以被子类中的方法直接访 问,在子类类体外可以通过子类对象访问。
02
OPTION
父类与子类不在同一个包中,则父类中的友好成员不可以被子类中的方法直 接访问,在子类类体外不可以通过子类对象访问,只能通过继承自父类的并 且子类可以访问的方法间接访问。
【例6.1】设计一个圆类,该类能够表示圆的位置和大小,能够计算圆的面
【例6.2】instanceof的用法。
Example6_02.java
CONTENTS
目录
6.1 子类及其对象 6.2 域的隐藏和方法的重写
6.3 对象的赋值兼容规则
6.4 final关键字 6.5 多态 6.6 abstract关键字 6.7 小结
6.2.1 域的隐藏
子类根据需要可以将继承自父类的方法重新定义以适合子类对象的需
6.2.3 super关键字
如果父类和子类中都定义了实例初始化器,则构造子类对象时,调用顺
序为“父类的实例初始化器→父类的构造方法→子类的实例初始化器→子类
的构造方法”。
【例6.5】平面上有若干条线段,已知每条线段两个端点的坐标。设计线段
类并创建线段类的对象表示线段。要求用继承的方法实现。 Example6_05.java
02
OPTION
03
OPTION
父类与子类在同一个包中,则父类中的保护成员可以被子类中的方法直接访 问,在子类类体外可以通过子类对象访问。
父类与子类不在同一个包中,则父类中的保护成员可以被子类中的方法直接 访问,但在子类类体外不可以通过子类对象访问。
04
OPTION
6.1.2 子类的可访问性
01
OPTION
CONTENTS
目录
6.1 子类及其对象 6.2 域的隐藏和方法的重写
6.3 对象的赋值兼容规则
6.4 final关键字 6.5 多态 6.6 abstract关键字 6.7 小结
6.3 对象的赋值兼容规则 在有继承关系的类中,可以用父类对象表示子类的对象,称为赋值兼容 规则。例如,类B是类A的子类,则下面的赋值是正确的: A a=new B(); 当用父类对象表示子类对象时,父类对象称为子类对象的上转型对象。 当一个父类对象表示的是子类对象时,还可以将该父类对象强制转换成 子类对象。如: B b=(B)a;
class 子类名 extends 父类名 {//子类类体 //…… }
Java语言只支持单重继承。除了Object类之外每个类都有一个父类,它
是所有类的直接父类或间接父类。
如果在定义一个类时没有说明该继承自哪一个类,则该类的父类是Object。
6.1.2 子类的可访问性
01
OPTION
父类的私有成员可以被子类继承,但只能通过继承自父类的并且子类可以访 问的方法间接访问。 类中的公有成员可以被子类中的方法直接访问,在子类类体外可以通过子类 对象访问。