230 likes | 419 Views
第六章 Java 语言的继承与多态. 合肥学院计算机系 吴晓琴. 本章内容. 6.1 继承 6.2 多态性 6.3 构造函数的继承与重载 6.4 Java 中的接口 6.5 Java 中的包. 6 . 1 继承. 1 . 继承与派生 ① 继承: 在已有类的基础上快速构造出新类的过程;派生:在构造新类的同时并新增新的特性的过程。 ② 基(父)类: 被继承特性的类; 派生(子)类: 在基类的基础上新创建出的类。 Point-->Rectangle-->Window-->Dialog
E N D
第六章 Java语言的继承与多态 合肥学院计算机系 吴晓琴
本章内容 6.1继承 6.2 多态性 6.3 构造函数的继承与重载 6.4 Java中的接口 6.5 Java中的包
6.1继承 1. 继承与派生 ① 继承:在已有类的基础上快速构造出新类的过程;派生:在构造新类的同时并新增新的特性的过程。 ② 基(父)类:被继承特性的类;派生(子)类:在基类的基础上新创建出的类。 Point-->Rectangle-->Window-->Dialog ③ 为什么要继承派生:实体之间不仅在横向具有关联特性,而具在纵向也存在继承与派生的特性(遗传与变异);充分利用此特性可快速地构造出新类。
④ 可行性:实体之间具有自然的相互关联性。 ⑤ 目的:对现有系统重用,而且还能扩充和完善现有系统。 ⑥ 派生类的定义 类的种类 class 派生类名 extends 基类名 { 成员定义; } 2.属性的继承与隐蔽 属性的继承 派生(子)类继承基(父)类非私有属性 Ko6.1
属性的隐蔽 派生(子)类重新定义与从基(父)类那里继承来的属性名(变量名)完全相同的变量,也就是说子类拥有两个变量名完全相同的变量。 子类执行从基(父)类那里继承的操作时,处理的是继承父类的变量, 子类执行自己定义的操作时,处理的是自己定义的变量 ko64 , hid
3.方法(函数)的继承与覆盖 方法的继承 派生(子)类继承基(父)类非私有方法 ko641 方法的覆 盖 派生(子)类重新定义与从基(父)类那里继承来的方法名完全相同的方法
与属性的隐蔽不同之处:父类的同名变量在子类对象中仍占有空间,而子类同名方法对父类的同名方法覆盖,将清除父类的同名方法占有空间,父类的同名方法在子类对象中不存在。与属性的隐蔽不同之处:父类的同名变量在子类对象中仍占有空间,而子类同名方法对父类的同名方法覆盖,将清除父类的同名方法占有空间,父类的同名方法在子类对象中不存在。 Ko6_5 4.方法的重载 重载函数:类体中“同名”而“不同形参”的成员函数。 ①作用:实现同种功能而不同的功能实现形式(OOP中的静态多态性)。 ② 调用规则:系统将根据实参与形参的个数或类型相匹配的关系来决定所调用的函数名。
③ 应用要点:重载函数只是以函数的形参的不同来判断的而不是以函数的返回值或函数形参名的不同来区分的。 如下函数不是重载函数定义 ! int add(int x,int y) int add(int a,int b) void add(int x,int y) int add(int x,int y) 注意: 1>继承与派生时的方法重写权限要求:重写的方法的访问权限不能有比基类更严格的访问权限和定义出更多的例外。 2>对象的类型识别:利用instanceof可以识别出对象所属的类型,从而依据不同类型的对象产生不同的行为。
5.类体中的this、super this:它代表当前名,一个类可以通过this变量来获得一个代表它自身的对象变量。 用途: 1>this(参数)调用本类中另一种形成的构造函数(应该为构造函数中的第一条语句); 2>在程序中易产生二义性之处,应使用this来指明当前对象;如果函数的形参与类中的成员数据同名,这时需用this来指明成员变量名
class Point class Circle extends Point • { { • private int x,y; private int radius; • public Point(int x,int y) public circle(int x0,int y0, int r ) • { { • this.x=x; super(x0,y0); • this.y=y; radius=r; • } } • public void Draw() public void Draw() • { { • super.Draw(); • drawCircle(); • } } • public Point() • { • this(0,0); • } • }
Super java中通过super来实现对父类成员的访问,super用来引用当前对象的父类。Super 的使用有三种情况:1)访问父类被隐藏的成员变量,如:super. 变量;2)调用父类中被重写的方法,如:super.成员函数据名(实参) 3)调用父类的构造函数,如:super(参数1,参数2…) 调用基类中的某一个构造函数(应该为构造函数中的第一条语句); ko6_3,ko6_4
注意: • 1>子类对象被视为父类的一个对象 • 2>父类对象不能当着是一子类对象 • 3>如果一个方法的形式参数是父类对象,那么调用时可以用子类对象为实在参数 • 4>如果父类对象引用指向实际是一个子类对象,那么父类对象引用可以用强制类型转换成子类对象的引用 • 在实例方法中可以使用 this和super,而在类方法中不能使用 this和super。
6.2多态性 多态是指一个程序中同名的不同方法的共存。 实现多态手段:函数覆盖、函数重载。 在java语言中,多态性体现在两个方面:由方法重载实现的静态多态性(编译时多态)和方法重写实现的动态多态性(运行时多态)。 1) 编译时多态在编译阶段,具体调用哪个被重载的方法,编译器会根据参数的不同来静态确定调用相应的方法。 2) 运行时多态由于子类继承了父类所有的属性(私有的除外),所以子类对象可以作为父类对象使用。程序中凡是使用父类对象的地方,都可以用子类对象来代替。一个对象可以通过引用子类的实例来调用子类的方法。 3) 重写方法的调用原则:java运行时系统根据调用该方法的实例,来决定调用哪个方法。对子类的一个实例,如果子类重写了父类的方法,则运行时系统调用子类的方法;如果子类继承了父类的方法(未重写),则运行时系统调用父类的方法。 4)父类与子类对象编程规则(赋值兼容原则):子类的对象可当着父类的对象来使用。
6.3 构造函数的继承与重载 构造函数的重载 构造函数的重载是指同一个类中存在若干个具有不同参数列表的构造函数 构造函数的继承 ①子类无条件继承父类的不含参数的构造函数; ②如果子类没有构造函数,它将继承父类的不含参数的构造函数作为自己的构造函数;如果子类自己定义了构造函数,在创建对象时,它将先执行继承自父类无参数的构造函数,再执行自己的构造函数; ③对于父类含参数的构造函数,子类可以通过在自己的构造函数中使用super来调用,该调用语句必须是子类构造函数的第一个执行语句 ko6_6
6.4 Java中的接口 1.含义:一组只有成员函数原型定义而无成员函数定义体的方法集。接口它定义了一组成员函数,但没有具体加以实现,其实现则是由实现该接口的类来加以实现的。 2.作用:为若干个类(相关或无关的类)定义一组相同的功能行为,从而达到相同的功能名称,不同的功能实现之目的;实现多重继承。 3. 定义格式(接口也可继承与派生): interface 接口名称 extends 父接口1,父接口2,父接口3 { }
4. 应用要点: ① 接口的类型:可以为public(可被任何包中的类实现);缺省未给定(只允许同一包中的类实现它) ② 接口内的成员变量:可以为public,final,static并且必须初始化(末指明时则为public final static类型,即类的常量)。 ③ 接口内的成员函数:末指明时为public static 类型(只有函数的原形而没有函数的定义体的函数)。 ④ 利用 extends可以声明多个父接口:各个父接口之间以“,”分隔,并且子接口继承所有的各个父接口中的成员方法 5. 实现接口:通过定义一个类同时采用implements来指明所实现的接口名,并在该类中重写接口中的所有成员方法且给出成员函数体定义。
实现接口时的应用要点:类中所实现的接口中的成员函数的原型都应该与它在接口中的原型定义保持一致;并在类中重写接口中的所有成员方法;通过实现接口,从而可扩充或增加该类的功能 6 .使用接口:接口名可以作为数据类型的定义符来声明给定接口类型的对象(如可用于定义对象变量、定义函数的对象形参等)从而通过此接口对象来访问类中所实现的成员函数体。 ① 编程规则:为访问接口中所定义的成员函数,必须通过接口对象来访问(因为此成员函数是在接口中定义而只是借助于类来实现,本质上仍属于接口中成员函数);但对接口类型的对象应通过其对应的实现类来实例化它。 Collection objC=new VectorClass(); objC.addElement(ObjectObj);
② 编程要点:但对类中新增加的其他成员函数的访问,则应通过定义类的对象。 VectorClass objV=new VectorClass(); objV.fun(); example :ko6_7 6.5 Java中的包 1. 含义:它是一系列类和接口的集合(主要是解决同名类或接口之间的冲突,一个包中的符号名如类名,接口名等不能重名);一个包即为一个小型类库。 2 . 包的定义(利用它可以实现将程序中的相关类和接口或子包组合在一起,统一命名,从而形成一个独立的外编译单元) package 包名;
3.缺省无命名: 如程序中未给定包的定义,则程序中的所有类和接口存贮在一无名包中。 4 .包的引用:可以在一个包中使用另一个包中所定义的类和接口,这可由import 语句来实现。 import 包名.类名; //引用包中的指定名称类 或 import 包名.* ; //引用包中的所有可用的类或接口 或 import 类名; //引用无名包中的指定名称类 应用要点: ① 如果引入的几个包中包括有名称相同的类,则当使用类时必须指明包含的包,以便编译器能正确区别它们 graphics.Rectangle rect; java.awt.Rectangle rect,;
包名:包名是全小写的名词,中间可以由点分隔开,例如:java.awt.event; 类名:首字母大写,通常由多个单词合成一个类名,要求每个单词的首字母也要大写,例如class HelloWorldApp; 接口名:命名规则与类名相同,例如interface Collection; 方法名:往往由多个单词合成,第一个单词通常为动词,首字母小写,中间的每个单词的首字母都要大写,例如:balanceAccount, isButtonPressed; 变量名:全小写,一般为名词,例如:length; 常量名:基本数据类型的常量名为全大写,如果是由多个单词构成,可以用下划线隔开,例如:int YEAR, int WEEK_OF_MONTH;如果是对象类型的常量,则是大小写混合,由大写字母把单词隔开。
② java.lang(语言包)总是被编译器自动引入到本程序所在的包中,故不必再采用 import引入它。 ③ 典型常用的包:java.io(文件读写);java.awt(GUI设计)java.net(网络通讯); java.applet(Applet设计)。 5.Java中的包与Java文件路径的关系 ①名为myPackage的包中,所有类文件都存储在目录为myPackage下; 在Package语句中,用“•”来指明目录的层次关系(package java.awt.image; 指定这个包中的类文件存储在目录path/java/awt/image下;其中path是classpath所指定的系统路径) set classpath =% classpath %; . ; ③未指定文件中的包名时(无名包时),所对应的目录为当前工作目录。
P167 6.1 6.4,6.5 补充:1.试编程实现属性的继承与隐蔽,方法的继承与覆盖,方法的重载. 2.试编程实现super,this的用法