单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第五章 类的继承和派生,Inheritance/extends/derive,第五章 类的继承和派生Inheritance/exten,1,本章知识点,继承概念和作用,子类的声明,类成员修饰符与继承的关系,理解父类和子类的关系,在子类中使用父类成员,(,方法,),继承机制下,对象创建的过程,(,构造方法的使用,super,调用,),子类对父类方法的重写,(super,调用,),本章知识点继承概念和作用,2,5.1,继承的概念和软件的重用性,继承:从已有的类中派生出新的类。,新的类能吸收已有类的数据属性和行为。,并能扩展新的能力。,父类是子类的一般化,子类是父类的特例化,(,具体化,),。,父类也称为超类或基类。,超类,/,基类,父类,子类,parents/super/base,child/derived,父 类,子 类,学生,研究生、大学生、小学生,形状,三角形、圆、矩形,雇员,教师、医生、职员,交通工具,轿车、卡车、公交车,水果,苹果,、,梨,、,桃、桔,5.1 继承的概念和软件的重用性继承:从已有的类中派生出新的,3,类之间的关系,“,is-a”,关系:类之间是继承的关系。,“,has-a”,关系:类之间是组合的关系,(,前,4.9,节,),。,5.1,继承的概念和软件的重用性,类之间的关系5.1 继承的概念和软件的重用性,4,5.1,继承的概念和软件的重用性,继承分类,单继承:一个子类最多只能有一个父类。,多继承:一个子类可有两个以上的父类。,说明:,Java,类只支持单继承,而接口支持多继承。,Java,多继承的功能则是通过接口方式来间接实现的。,继承使软件的代码得到重用,提高了系统的效率。,在继承关系中,子类通过吸收父类的数据,(,属性,),和方法,(,行为,),,并增加新功能或修改已有功能来创建新类。,5.1 继承的概念和软件的重用性继承分类,5,5.1,继承的概念和软件的重用性,Object,类:,Java,中所有类的父类,定义和实现了,Java,系统下所有类的共同行为,所有的类都是由这个类继承、扩充而来的。,认识,Object,类中的方法,5.1 继承的概念和软件的重用性Object类:Java中所,6,5.2,子类的定义,子类定义的一般格式,类修饰符,class,子类名,extends,父类名,成员变量定义;,成员方法定义;,在子类的定义中,用关键字,extends,来明确指出它所继承的父类。,5.2 子类的定义子类定义的一般格式,7,【例5-1】通过继承来定义子类。,package chap5.example5_1;,public class Automobile,private,String,number;,public void setNumber(,String,number),this.number=number;,void showNumber(),System.out.println(车牌号:+number);,交通工具类,Automobile,车牌号,number,setNumber(),显示车牌号,showNumber(),卡车类,Truck,载重量,capacity,setCapacity(),显示载重量,showCapacity(),【例5-1】通过继承来定义子类。package chap5,8,【例5-1】通过继承来定义子类。,package chap5.example5_1;,public class Truck extends Automobile,private,double,capacity;,public void setCapacity(,double,capacity),this.capacity=capacity;,public void showCapacity(),System.out.println(卡车载货容量:+capacity+吨);,卡车类,Truck,载重量,capacity,setCapacity(),显示载重量,showCapacity(),【例5-1】通过继承来定义子类。package chap5,9,【例5-1】通过继承来定义子类。,package chap5.example5_1;,public class TruckTest,public static void main(String args),Truck tc=new Truck();,tc.setNumber(,京,E 88888);,tc.setCapacity(10);,tc.showNumber();,tc.showCapacity();,子类使用从父类中继承的方法,交通工具类,Automobile,车牌号,number,setNumber(),显示车牌号,showNumber(),卡车类,Truck,载重量,capacity,setCapacity(),显示载重量,showCapacity(),子类使用从父类中继承的方法,【例5-1】通过继承来定义子类。package chap5,10,5.3,作用域与继承,成员访问控制修饰符在继承中的性质,public,、,private,、,package,、,protected,父类的,public,成员,可以在父类中使用,也可以在子类使用。程序可以在任何地方访问,public,父类成员。,父类的,private,成员,仅在父类中使用,在子类中不能被访问。,父类的,protected,成员可在子类被访问,无论子类与父类是否存储在同一个包下。,父类的,package,成员可在同一包的子类中被访问。,5.3 作用域与继承成员访问控制修饰符在继承中的性质,11,5.3,作用域和继承,成员访问控制修饰符的具体应用,父类中,属性的修饰符,:子类应依赖于父类的服务,而不应依赖于父类的数据。所以,应该将父类中的成员变量声明为,private,,,并在父类中定义访问这些,private,成员变量的,public,型的方法。,(public,、,protected,和,package,较少修饰属性,),父类中,方法的修饰符:,关于父类中的,private,方法,如果某个方法是为类中其他的方法提供服务,只在类中使用,将其定义为,private,,对外界隐藏。,5.3 作用域和继承成员访问控制修饰符的具体应用,12,5.3,作用域和继承,子类从父类继承成员时,父类的所有,public,、,protected,、,package,成员,在子类中都保持它们原有的访问修饰符。,例如,父类的,public,成员成为子类的,public,成员。父类的,protected,成员也会成为子类的,protected,成员。,子类只能通过父类所提供的非,private,方法来访问父类的,private,成员。,5.3 作用域和继承子类从父类继承成员时,父类的所有publ,13,5.4,继承下的构造方法,继承下的构造方法的调用次序,子类构造方法在执行自己的任务之前,将,显式,地,(,通过,super,引用,),或,隐式,地,(,调用父类默认的无参数构造方法,),调用其直接父类的构造方法。,类似地,如果父类派生于另一个类,则要求父类的构造方法调用上一级类的构造方法,依此类推。调用请求中,最先调用的一定是,Object,类的构造方法。,创建对象的过程:先父后子。,5.4 继承下的构造方法继承下的构造方法的调用次序,14,【,例,5-2-1】,构造方法的隐式调用过程。,package chap5.example5_2_1;,public class Shape,private String name;,public Shape(),System.out.println(Shape,的无参构造方法,:Shape();,package chap5.example5_2_1;,public class Circle extends Shape,private double r;,public Circle(double r),this.r=r;,System.out.println(Circle,的带参构造方法,:Circle(double);,package chap5.example5_2_1;,public class Test,public static void main(String args),Circle circle=new Circle(1);,为了避免错误,父类中至少定义一个,无参的构造方法。,【例5-2-1】构造方法的隐式调用过程。package ch,15,【,例,5-2-2】,构造方法的显式调用过程。,package chap5.example5_2_2;,public class Shape,private String name;,public Shape(),System.out.println(Shape,的无参构造方法,:Shape();,public Shape(String name),super();/,调用,Object,的构造方法,this.name=name;,System.out.println(Shape,构造方法,:Shape(String);,public String getName(),return name;,【例5-2-2】构造方法的显式调用过程。package ch,16,【,例,5-2-2】,构造方法的显式调用过程。,package chap5.example5_2_2;,public class Circle extends Shape,private double r;,public Circle(String name,double r),super(name);,/,显式调用父类的构造方法,this.r=r;,System.out.println(Circle,的带参构造方法,:Circle(String,double);,public void show(),System.out.println(“,我是,”+getName()+“.,半径,=”+r);,/,调用了父类方法,package chap5.example5_2_2;,public class Test,public static void main(String args),Circle circle=new Circle(,小圆,1);,circle.show();,【例5-2-2】构造方法的显式调用过程。package ch,17,类继承和派生课件,18,5.5,方法的重新定义,(overriding),方法的重写,:如果在子类中某个方法与父类的某个方法有,相同方法署名,(,方法头,),,则称子类重写,(overriding),了父类的该方法。,效果:子类对象调用这个方法时,将使用子类中定义的方法,对它而言父类中定义的方法已经“看不见”了。,5.5 方法的重新定义(overriding)方法的重写:如,19,【例5-3】方法的重写。,形状类,Shape,名称,name,构造方法,show(),圆,Circle,半径,r,构造方法,show(),【例5-3】方法的重写。形状类 Shape圆 Circle,20,【例5-3-1】方法的重写。,package chap5.example5_3_1;,public class Shape,private String name;,public Shape(),public Shape(String name),super();,this.name=name;,public String getName(),return name;,public void setName(String name),this.name