黑马程序员-继承,多态

来源:互联网 发布:域名备案需要的资料 编辑:程序博客网 时间:2024/04/28 16:40
----------------------android培训、java培训、期待与您交流! ----------------------
一继承的概述
多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继那个类即可。
l多个类可以称为子类,单独这个类称为父类或者超类。
l子类可以直接访问父类中的非私有的属性和行为。
l通过 extends 关键字让类与类之间产生继承关系。
•class SubDemo extends Demo{}
一、继承特点:
1、提高代码复用性,定义在父类中的成员(变量和方法),可以被子类重复使用;
2、让类与类之间产生关系,这样就会有多态的特性。使得应用起来更方便。
需要注意的是:
A.不可以只是为了获取其他类的功能,简化代码就一味的使用继承;必须是类与类之间有所属关系,才可以用继承,这种关系称为“is-a”。
B.java语言中,只支持单继承,不支持多继承。究其原因,是因为多继承容易带来安全隐患:
a.当多个父类中定义了相同的功能,且功能内容不同时,子类对象并不确定要运行哪一个,这就造成了程序的混乱而导致异常出现。
b但是java保留了这种机制,并改良了多继承为多实现,而且接口就可以多继承
二super关键字
1)super和this的用法相像
2)this代表本类对象的引用
3)super代表父类的内存空间的标识。
4)当子父类出现同名成员时,可以用super进行区分
5)子类要调用父类构造函数时,可以使用super语句。
函数:(覆盖(重写))
l类中出现与父类一模一样的方法时,会出现覆盖操作,也称为重写或者复写。
l父类中的私有方法不可以被覆盖。
l在子类覆盖方法中,继续使用被覆盖的方法可以通过super.函数名获取。
l覆盖注意事项:
覆盖时,子类方法权限一定要大于等于父类方法权限
静态只能覆盖静态。
l覆盖的应用:
当子类需要父类的功能,而功能主体子类有自己特有内容时,可以复写父类中的方法,这样,即沿袭了父类的功能,又定义了子类特有的内容。
子父类构造函数:
子类的构造函数中有一个隐式的构造函数
特点:在对子类对象进行初始化时,父类构造函数也在运行,而且是在子类之前运行。因为子类构造函数默认第一行有一条隐式语句:super();(没有显式的继承父类的类中,是默认继承Object的,所以构造函数第一条语句仍是super();),因此会首先访问父类中空参数的构造函数(在不手动加入含有参数的super的语句的情况下),这是系统默认的。所有的构造函数均是如此。
二   多态

多态:可理解为事物存在的多种体现形态。又称为动态绑定,是java的核心机制之一。

理解:多态是在运行期间,判断引用实际类型,根据实际类型调用相应的方法。

比如说人又男女之分,动物有猫、狗等之分

一、多态的体现形式:

1、父类的引用指向了自己子类的对象。

2、父类的引用可接收子类的对象。

二、多态的前提:

1、必须是类与类之间的关系,如继承和实现关系

2、要存在覆盖的操作,父类中必须由方法被子类覆盖,即重写

3、有父类引用指向子类对象

三、多态的利弊:

1、好处:大大提高了程序的扩展性

2、弊端:虽然提高扩展性,但是只能使用父类的引用访问父类中的成员,不可预先使用子类。这是由于,子类在父类之后加载,此时还没有子类被加载。

在下面的代码中,Animal a = new Cat();是一种“类型提升,向上转型”的过程。如果要实现Cat中的其他Animal没有的功能,那么就需要强制将父类的引用转换成子类类型,然后再调用子类的方法


四、多态的特点:

1、在多态中成员函数的特点:

      ·编译时期:参阅引用型变量所属的类中,是否有调用的方法,如果有,则编译通过,若没有,则编译失败。如上面的代码中,引用型变量a是父类Animal的类型,其中有eat 的方法,所以没问题,但是如果调用a.catchM()就会编译失败。

      ·运行时期:参与对象所属的类中,是否有调用的方法。如引用型变量c是所属于Cat类型的,可以调用c.catchM()

总结:成员函数在多态调用时,编译看左边,运行看右边。子类中局部有变量就访问局部的,没有就访问成员的变量,成员中没有的就在父类中找;如果父类中没有,编译失败。

2、在多态中成员变量(和静态成员)的特点:

·无论编译和运行,都参考左边的,即引用型变量所属的类型。也就是说父类中有自己的变量,则先找父类自己的成员。

·非静态有重写的特点,静态一般不被重写。

原因:因为当调用静态方法时,只要建立子类对象,父类与子类中的静态方法都会随之加载入内存,是不需要调用就可直接用类名.方法名的,而不需要对象。只要引用还存在,就看引用变量的类型。


----------------------android培训、java培训、期待与您交流! ----------------------

原创粉丝点击