java的继承

上传人:今*** 文档编号:107012192 上传时间:2019-10-17 格式:PPT 页数:42 大小:531KB
返回 下载 相关 举报
java的继承_第1页
第1页 / 共42页
java的继承_第2页
第2页 / 共42页
java的继承_第3页
第3页 / 共42页
java的继承_第4页
第4页 / 共42页
java的继承_第5页
第5页 / 共42页
点击查看更多>>
资源描述

《java的继承》由会员分享,可在线阅读,更多相关《java的继承(42页珍藏版)》请在金锄头文库上搜索。

1、1,第5讲 Java的继承,继承的概念 继承的实现 变量隐藏与方法覆盖 super关键字 子类的构造顺序 final关键字,回顾:为什么要使用封装,下面代码有什么问题? 如何解决上面设计的缺陷?,Dog d = new Dog(); d.age = 1000;,不合理的赋值,使用封装,回顾:什么是封装,面向对象三大特征之一封装 封装的概念 封装的好处,封装:将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问,隐藏类的实现细节,只能通过规定方法访问数据,方便加入控制语句,方便修改实现,回顾及提问,构造方法的语法要求是什么? static和fin

2、al的含义是什么? 请一位同学到白板上画出下面Dog类的类图。,回顾:类图,使用类图描述类 用于分析和设计“类” 直观、容易理解,“+”:public “-”:private “#”:protected,类名,返回值类型,类型,属性名,参数: 名字:类型,名字:类型,方法名,为什么使用继承 ?,这两个类图有什么问题?,使用继承优化设计,将重复代码抽取到父类中,为什么使用继承 ?,使用继承优化后:,子类与父类是is-a关系,即小类是大类中的一种是继承的基础,减少代码量,方便修改代码,8,现欲定义人(Person)类和学生(Student)类,拟设立如下的属性、方法:,问题:Student类的很多

3、属性、方法与Person类相同,新增的部分较少。在已声明Person类的情况下,定义Student类时是否需要将其所有属性、方法写一次?有无简便方法可用?,9,回答是肯定的,我们可以让Student类继承Person类。这样,Student类就可以利用Person已有属性、方法,定义时只要增加新的属性与方法即可。,从上可知,引入“继承”机制后,可以充分利用已有的“旧类”的属性、方法,简化“新类”的设计。,继承,10,继承的概念: 概念:是指在已存在的类的基础上扩展产生新的类。 已存在的类称为父类(或父类、超类),新产生的类称为子类(或派生类)。上面提到的Person类就是父类,Student类

4、是子类。 子类继承了父类,它拥有父类的所有特性(除构造方法不被继承外),当然也可以向子类添加新的属性、方法,或改写父类原有方法,这些新变化的内容仅仅属于子类所有。 意义:继承是面向对象程序设计最重要的特征之一,是实现代码重用、扩展软件功能的重要手段。 父类:更一般、更泛化 子类:更具体、更细化,11,类的层次性: 下面以Java类库中的一些类继承关系说明如下:,一个类的子类可以是另一个类的父类,由继承关系可以形成类的层次性。,12,继承的实现 类的继承格式:,class 子类名 extends 父类名 /新增属性、方法,或改写父类原有方法 ,例如:class B extends A 又如:cl

5、ass Student extends Person ,13,说明: 如果没有用extends指明父类,则默认继承Object根类,Object类是所有类的直接父类或间接父类,有关Object类的内容稍后介绍; Java只支持单一继承,不允许多重继承,即: 一个子类只能有一个父类 一个父类可以派生出多个子类,14,采用继承机制后,简化了类的设计:只要写子类中不同父类的内容(即新增属性、方法,或改写父类原有方法),/B类继承A类 class A /父类 int x=10; public void setX(int x) this.x=x; public int getX() return x;

6、public String toString() String information=“; information=information+“x= “+x+“n“; return information; ,15,class B extends A /子类继承父类 int y=100; /子类新增属性 public void setY(int y) /子类新增方法 this.y=y; public int getY() /子类新增方法 return y; public String toString() /子类改写父类方法 String information=“; information=

7、information+“x= “+x+“n“; information=information+“y= “+y+“n“; return information; public class InheritTest public static void main(String args) A a=new A(); B b=new B(); System.out.println(a.toString(); System.out.println(b.toString(); ,程序运行结果: x= 10 x= 10 y= 100,16,变量隐藏与方法覆盖 通过前面的介绍,我们已经知道: 子类继承了父类

8、的所有成员(变量和方法,除构造方法外)(注意:由于访问权限的限制,并不意味着父类的所有变量、方法都可以在子类中直接使用); 子类还可以根据需要,增加自己的变量和方法; 除此之外,我们还可以对父类已有变量、方法进行隐藏、覆盖。 Java允许在子类定义与父类同名(类型可以不同)的变量,在子类中直接使用这一变量名时,访问的是子类定义的变量,而父类同名的变量则被隐藏起来,这称为变量的隐藏。,17,Java还允许在子类中对父类原有的方法进行重写,以实现新的功能。 所谓方法覆盖(override),是指在子类中重新定义一个方法的内容,该方法与父类的某一方法在方法名、参数(包括类型、个数、次序)、返回值类型

9、 完全相同。 当子类对象中调用这一方法时,调用的是子类改写过的方法,而父类中的原有方法被覆盖。,18,方法重写必须满足如下要求: 重写方法和被重写方法必须具有相同的方法名; 重写方法和被重写方法必须具有相同的参数列表; 重写方法的返回值类型必须和被重写方法的返回值类型相同或者是其子类; 重写方法的不能缩小被重写方法的访问权限。 子类方法不能抛出比父类方法更多的异常。 例如:在前面的B类中已改写了toString( )方法的内容(即方法覆盖),使之能够输出y的值。现在,在B类中再增加一个double型的变量x,这样父类中的整型变量x就被隐藏,在toString()访问的是子类的值。 主要代码如下

10、:,19,public class Circle extends Point public int x, y ,radius; public String toString() public String toString(int x, int y, int radius) ,public class Point public int x, y; public String toString() ,变量的隐藏,方法的覆盖,方法的重载,20,下面的例子演示了变量隐藏与方法覆盖的使用方式。,/B类继承A类 class A /父类 int x=10; /被隐藏的变量 public void setX

11、(int x) this.x=x; public int getX() return x; public String toString() /被覆盖的方法 String information=“; information=information+“x= “+x+“n“; return information; ,21,/父类代码与前面相同,这里省略不写 class B extends A /子类继承父类 double x=-12.345 /变量隐藏 int y=100; /子类新增属性 public void setY(int y) /子类新增方法 this.y=y; kjdown pub

12、lic int getY() /子类新增方法 return y; public String toString() /子类改写父类方法,即方法覆盖 String information=“; information=information+“x= “+x+“n“; information=information+“y= “+y+“n“; return information; public class InheritTest public static void main(String args) A a=new A(); B b=new B(); System.out.println(a.t

13、oString(); System.out.println(b.toString(); ,程序运行结果: x= 10 x= -12.345 y= 100,变量隐藏容易引用变量的使用混乱,不赞成使用,而方法覆盖则是大量使用,应掌握其内容。(问题:方法覆盖与方法重载区别是什么?),/B类继承A类 class A /父类 int x=10; /被隐藏的变量 public void setX(int x) this.x=x; public int getX() return x; public String toString() /被覆盖的方法 String information=“; inform

14、ation=information+“x= “+x+“n“; return information; ,22,方法覆盖(override)与方法重载(overload)的异同,相同点: 都要求方法同名 都可以于于抽象方法和非抽象方法之间 不同点: 方法覆盖要求参数签名必须一致,而方法重载要求参数签名必须不一致。 方法覆盖要求返回类型必须一致,而方法重载不做限制。 方法覆盖只能用于子类覆盖父类的方法,方法重载用于同一个类的所有方法(包括从父类中继承而来的方法)。 方法覆盖对方法的访问权限和抛出的异常有特殊的要求,而方法重载没有限制。 父类的一个方法只能被子类覆盖一次,而一个方法所在的类中可以被多

15、次重载,23,super关键字 如果要访问父类的隐藏变量、覆盖方法(需要有相应的访问权限),这该怎样办呢? 答案是使用super关键字,下面介绍该关键字的用法: Super 可用来引用父类的成分,它有两种主要用法: 引用父类的成员(需要相应的访问权限): super.变量 或 super.方法(参数列) 在子类构造方法中调用父类的构造方法: super();/与this用法类似,应放在构造方法的第一行位置上。 还是以前面的B类继承A类为例说明如下:,24,子类的构造顺序 下面通过一个例子来说明子类的构造顺序:,class A public A() System.out.println(“调用了A类的构造方法“); class B extends A public B() System.out.println(“调用了B类的构造方法“); public class C extends B public C() System.out.println(“调用了C类的构造方法“); public static void main(String args) C c=new C(); ,程序运行结果: 调用了A类的构造方法 调用了B类的构造方法 调用了C类的

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


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

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