黑马程序员——Java之多态性

——–Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-

函数的重写(覆盖):
* (1)当子类和父类中出现一摸一样的函数时(包括返回值类型,不包括权限修饰符),当子类对象调用该函数时,会运行子类函数的内容,就好像父类的函数被覆盖了一样
* (2)子类重写父类中的方法,必须保证子类方法的权限大于等于父类该方法的权限,才可以进行重写,否则编译失败
* (3)静态方法只能覆盖静态方法(这样做一般没有什么实际意义)
* 注意:
* 重载:只看同名函数的参数列表
* 重写:子类和父类的该重写方法要一模一样,包括返回值类型(在多态中允许返回值类型不一样,注意理解),函数名,参数列表(类型和顺序)
*
* 构造函数:
* 为什么子类一定要访问父类中的构造函数?(默认方式和手动指定方式)
* 因为父类中的数据子类可以直接获取,所有子类建立对象时,需要先查看父类是如何对这些数据进行初始化的,所以子类在对象初始化时,要先访问一下父类中的构造函数
* 所以,子类对象在对象初始化时,要先访问父类的构造函数
* 注意:
* super语句一定在子类构造函数的第一行,构造函数中this与super不能共存,
*
*子类的实例化过程:
* 结论:
* (1)子类的所有的构造函数,默认都会有一个访问父类中空参的构造函数,因为,子类的每一个构造函数内的第一行都有一个隐示的super();语句
* (2)当父类中没有空参的构造函数时,在子类的构造函数中必须手动通过super();语句的形式来指定要访问父类中的哪个构造函数
* (3)当然,子类的构造函数的第一行也可以手动指定this语句来访问本子类中的构造函数,但是子类中至少会有一个构造函数会访问父类中的构造函数
* final(最终):作为一个修饰符
* (1)可以修饰类,函数,变量
* (2)被final修饰的类不可以被继承,继承有利有弊(弊:是对封装性的挑战;利:提高了代码的复用性),为了避免被继承,避免子类覆盖父类的方法
* (3)被final修饰的方法不可以被重写
* (4)被final修饰的变量是一个常量,只能被赋值一次,既可以修饰成员变量,又可以修饰局部变量(一旦被final修饰后,其值就不能再改变),常量的书写规范:所有字母都大写,如果由多个字母组成,单词间用’_’连接
* 修饰类的修饰符:
* (1)public (2)缺省 (3)final
* abstract(抽象)修饰符:该关键字可以修饰,类和方法
* 抽象类的特点:
* (1)抽象方法一定在抽象类中
* (2)抽象方法和抽象类必须被abstract关键字修饰
* (3)抽象类不能用new关键字创建对象,因为调用抽象方法没意义(抽象方法连方法体都没有)
* (4)抽象类中的抽象方法要被使用,必须由子类重写(实现)所有的抽象方法后,通过子类创建对象调用,如果子类只重写了部分抽象方法,那么该子类还是一个抽象类
* a: 抽象类和一般类没有太大的不同,该如何描述事物,就如何描述事物,只不过,该事物出现了一些看不懂得东西,这些不确定的部分,也是事物的功能,需要明确出现,但是无法定义函数主体,通过抽象方法来表示
* b:抽象类比一般类多了抽象函数,就是定义了抽象函数
* c:抽象类不可以实例化
*
* 特殊情况:在一个抽象类中可以不定义抽象的方法,这样做仅仅是为了不让该类创建对象
* 模版方法设计模式:
* 模版方法:在定义功能时,功能的一部分是确定的,但是有一部分是不确定的,而确定的部分在使用不确定的部分,那么这时就将不确定的部分暴露出去,又该类的子类来实现这部分不确定的部分
*
* interface(接口)
* 初期理解:可以认为接口是一种特殊的抽象类
* 当抽象类中的方法都是抽象方法时,那么该类可以通过接口的形式来表示
* 接口定义格式特点:
* (1)接口中常见的成员有:常量,抽象方法
* (2)接口中的成员都有固定的修饰符:常量(public static final),抽象方法(public abstract)
* (3)接口中的成员的是public的(因为需要向子类暴露,以便子类实现和使用)
* 接口:是不可以创建对象的,因为有抽象方法;需要被子类实现,子类对接口中的抽象方法全部重写后,子类才可以实例化,否则子类任然是一个抽象类
*
* Java中类与类之间只允许单继承,但允许多实现(因为就算不同的接口中出现了同名的方法,实现类在实现该方法是会覆盖该同名方法)
* Java中接口与接口之间允许多继承
*
* 接口的特点:
* 接口是对外暴露的规则
* 接口是程序的功能扩展(类需要接口中的功能才实现,不需要该功能就不需要实现该接口)
* 接口可以用来多实现
* 类与接口之间是实现关系,而且类可以继承一个类的同时实现多个接口
* 接口与接口之间可以有继承关系(并且可以一个接口继承多个接口)
*
*
*多态(函数的多态性(函数重载,函数重写)和对象的多态性(重点)):可以理解为事物存在的多种体现形态
* (1)多态的体现
* 父类的引用指向了自己子类的对象(父类的引用可以接受子类的对象)
* 类型提升(向上转型):子类类型自动转化为父类类型
* (向下转型):强制将父类的引用(但是父类的引用是指向子类对象的),转化成子类类型;而不能将父类的对象转化为子类对象
* 因此:多态自始至终都是子类对象在发生变化
*在多态中非静态的成员函数的特点:
* 编译程序时:对象还没有产生,参阅引用型变量所属的类中(父类)是否有调用的方法,如果有,编译通过,否则编译失败
* 运行程序时:参阅对象所属类(子类)中是否有调用的方法,有则调用的是子类的方法
* 总结:成员函数在多态调用时,编译看左边,运行看右边
*在多态中静态的成员函数的特点:
* 无论编译和运行,都参考左边(引用型变量所属的类
*静态绑定(静态方法和静态成员变量与所属的类绑定)
*动态绑定(非静态方法与非静态成员变量与调用其的对象绑定)
*在多态中成员变量的特点:
* 无论编译和运行,都参考左边(引用型变量所属的类)
* (2)多态的前题
* 必须类与类之间有关系,要么继承,要么实现,通常还有一个前提,存在覆盖
* (3)多态的好处
* 多态的出现大大的提高了程序的可扩展性
* (4)多态的弊端
* 提高了程序的可扩展性,但是只能使用父类的引用访问父类中的成员

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值