面向对象——继承(1)
-------android培训、java培训、期待与您交流!----------
内容: 继承(类之间五种关系)、复写、抽象方法(模板方法设计模式)、多态。
1、继承的概述:
特点与作用:
b、继承的出现让类与类之间产生了关系,提供了多态的前提。
类中的成员:
2、继承的特点:
(为弥补该功能,Java支持多实现(实现接口)功能,之后会学。)
C、继承是继承父类的全部非私有的成员(变量和方法),所以不要仅因需要单功能而继承;
在多层次继承出现的继承体系中,通常看父类中的功能,了解该体系的基本功能,建立子类对象即可使用该体系功能。
3、类与类之间的五种关系:
A、泛化(Generalization):
B、依赖(Dependency) :
C、关联:
4、覆盖(重写):当子类出现与父类出现相同的函数(但数据内容不同)时,子类调用该函数时会运行子类函数的内容,这就相当于重写(覆盖)父类的方法。
特点:有利于功能的扩展,即延续父类功能,定义子类特有内容。
【这是软件更新扩展的基础,Java中的继承和实现等都使用。】
注意:
1、子类覆盖父类方法,保证子类的权限必须大于父类,才能覆盖,不然编译失败;
2、静态只能覆盖静态(不常用,主要是静态不能覆盖非静态)。
【重载:只看同名函数的参数列表;
重写:子父类方法(参数列表与返回值类型)一样,方法体内容不同。】
子类的实例化过程(子父类中的构造函数):
1、子类中所有的构造函数默认都会访问父类中空参数的构造函数
2、因为每一个构造函数的第一行都有一条默认的语句super( ); [因为先初始化父类数据]
3、子类会具备父类中的数据,所以要先明确父类是如何对这些数据初始化的。
4、当父类中没有空参数的构造函数时,子类的构造函数必须通过this或者super语句指定要访问的构造函数。
5、super关键字
super:代表的是父类对象的引用。
this:代表的是本类对象的引用;
当子类要调用父类已定义好的功能时:(super关键字的应用)
super(参数);
构造函数中super( );的作用:调用父类的构造函数,初始化从父类继承的对象数据。
构造函数中的super()与this( )语句:
this();和super( );两者不能同时出现在同一构造函数中:
1、因为两者都要处于构造函数的第一行;
2、而两者都处于第一行的原因是初始化动作要先执行。
(不过在继承中因为每个子类构造函数都有默认super( )语句,当存在this( )语句时它会在访问其他子类构造函数的同时也实现super( );语句的动作。)
5、final关键字:
1、final可以修饰类,方法,变量;
2、final修饰的类不可以被继承;
3、final修饰的方法不可以被覆盖;
4、final修饰的变量是一个常量,只能被赋值一次;
5、内部类定义在类中局部位置上时,只能访问被final修饰的局部变量。
应用:
[作为常量:常量的书写规范所有字母都大写,如果由多个单词组成。单词间通过_连接。]
类的修饰符:public、final与默认无修饰符。
6、抽象类:
这时,只抽取功能定义,而不抽取功能主体。封装成为抽象类,类中有抽象方法。
抽象类的特点:
1,抽象方法一定在抽象类/接口中。
2,抽象方法和抽象类都必须被abstract关键字修饰。
3,抽象类不可以用new创建对象(即不可以被实例化)。因为调用抽象方法没意义。
4,抽象类中的抽象方法要被使用,必须由子类复写起所有的抽象方法后,建立子类对象调用。
abstract关键字,不能共存和哪些关键字:
1、final:被final修饰的类不能有子类。而被abstract修饰的类一定是一个父类。
2、private:修饰私有化方法,不能被子类所知,就无法被复写。而抽象方法必需要被复写。
3、static:修饰的方法,直接类名调用即可,无需创建对象,但是抽象方法运行没意义。
抽象方法:
抽象方法只有方法声明,没有方法体,定义在抽象类中。
格式不同于一般方法:
[
【 如果是{ }则属于一般方法,只不过是方法体为空,则不能用abstract修饰】
(当类中存在抽象方法,该类就是抽象类,必须用abstract修饰,抽象类可以存在一般方法)
PS:当抽象类中所有的方法都为抽象方法时,该类或称为接口(implements )。
抽象类与一般类的区别:
抽象类中存在构造函数:
特殊:抽象类中可以不定义抽象方法,这样做仅仅是不让该类建立对象(不能被实例化)。
7、模板方法设计模式:
当定义功能时,功能的一部分是确定的,但是有一部分是不确定,而确定的部分在使用不确定的部分,那么这时就将不确定的部分封装成单独的方法暴露出去,由该类的子类去完成。
(不确定部分的方法可根据需要设为抽象方法或一般方法)
示例 :
abstract class GetTime {
}
class SubTime extends GetTime {
}
8、接口:
class用于定义类;
格式:
接口定义时,格式特点:
1,接口中常见定义:常量,抽象方法。
2,接口中的成员都有固定修饰符:
记住:接口中的成员都是public的。
接口的出现将“多继承”通过另一种形式体现出来,即“多实现”。
接口: (与抽象类共性)是不能直接创建实例对象,因为有抽象方法,需要被子类实现。
子类对接口中的抽象方法全都覆盖后,子类才可以实例化;否则子类是一个抽象类。
注意:
接口与接口之间存在多继承、多实现,而类与类之间只能存在单继承、多实现。
1、接口间的允许多继承是因为接口的方法:只有方法声明、没有方法体;
2、但是不允许一个接口多继承的(父类)接口间存在同名但返回值类型不同的情况,因为出现这种情况,当类实现该接口无法判断实现哪一种情况。
接口特点 :
2、是程序的功能扩展;
3、接口的出现降低耦合性;
4、接口可以用来多实现。(举例,如:USB、PCI、主板、插座)
9、多态:
定义:
程序中体现:
好处和作用:
总结: 一、使用父类类型的引用指向子类的对象;
注意:
2、如果要直接给从父类继承的变量重新赋值,则需要在子类的方法中才能进行;
因为不能直接在类体中给变量进行赋值,只能在变量声明的同时进行初始化赋值。
多态的3个必要条件:
1.继承(或实现);2.重写(覆盖);[如果是重载也不行,因为与父类拥有的方法不同]
3.父类引用指向子类对象(Father f = new Child( );
【老话,看视频或看代码文件DuoTai.java观察、理解】
多态中成员:
1、成员函数的特点:
在编译时期:参阅引用型变量所属的类中是否有调用的方法。如果有,编译通过,如果没有编译失败。
简单总结就是:成员函数在多态调用时,编译看左边,运行看右边。(也可用动态绑定理解)
2、在多态中,成员变量的特点:
无论编译和运行,都参考左边(引用型变量所属的类)。
3、在多态中,静态成员函数的特点:
无论编译和运行,都参考左边。
概括理解:
即:多态中 :