多态和抽象类

多态和抽象类

多态

在程序中, 一个类的引用指向另外一个类的对象, 从而产生多种形态。 当二者存在直接或者间接的继承关系时, 父类引用指向子类的对象, 即形成多态。
多态是面向对象三大特性之一,学好多态对学习java非常重要,记住继承是多态的前提,如果类与类之间没有继承关系,也不会存在多态.

  • 多态:在代码中的描述是用父类的引用指向子类的对象
//父子关系:Student extends Person
Person person = new Student();
  • java程序运行分成两个阶段:编译,运行

编译阶段:从打开程序到执行运行之前—只能识别 “=” 前面的引用类型,不会识别 “=” 后面的对象
运行阶段:从运行开始—识别=后面对象,对象开始干活儿

例如:Person person = new Student();
编译阶段识别: person 是Person类的引用
运行阶段识别:new出来的Student对象

  • 在多态下只能直接调用父类有的方法,不能直接调用子类特有的方法

多态的优点

可以提高代码的扩展性,使用之前定义好的功能,后面直接拿来使用,不用再创建新的方法。

对象转型

注意:在多态的前提下再说向上转型,向下转型.

向上转型

对象由子类类型, 转型为父类类型, 即是向上转型。

  • 向上转型是一个隐式转换,相当于自动类型转换, 一定会转型成功。
  • 向上转型后的对象, 只能访问父类中定义的成员。
  • 作用:实现多态

向下转型

对象由父类类型, 转型为子类类型, 即是向下转型。

  • 向下转型是一个显式转换,相当于强制类型转换, 有可能转型失败.
  • 向下转型后的对象, 将可以访问子类中独有的成员。

instanceof关键字

向下转型, 存在失败的可能性。 如果引用实际指向的对象, 不是要转型的类型, 此时强制转换, 会出现 ClassCastException 异常。

所以, 在向下转型之前, 最好使用 instanceof 关键字进行类型检查。

  • instanceof:是一个运算符 (结果类型为boolean)
  • 用法: 对象 instanceof 类或类的子类
  • 原理说明:确定当前的对象是否是后面的类或者子类的对象,是返回true,不是false
  • 作用:进行容错处理,增加用户体验

多态中的方法重写

当向上转型后的对象, 调用父类中的方法。 如果这个方法已经被子类重写了, 此时调用的就是子类的重写实现!

抽象类

在现实世界中, 存在的都是“动物”具体的子类对象, 并不存在“动物”对象。 所以Animal类不应该被独立创建成对象。
对于这样的场景, 我们可以将动物类, 设计为抽象类。 抽象类不能被实例化对象, 只是提供了所有的子类共有的部分。

抽象类定义

在继承中,提取父类方法的时候,每个子类都有自己具体的方法实现,父类不能决定他们各自的实现方法,所以父类干脆就不管了,在父类中只写方法的声明(负责制定一个规则),将方法的实现交给子类.在类中只有方法声明的方法叫抽象方法,拥有抽象方法的类叫抽象类

  • abstract:抽象的
  • 声明:不写函数体的函数,可以叫声明
  • abstract修饰方法:抽象方法
  • abstract修饰类:抽象类
  • 抽象类的功能:1.可以节省代码 2.可以制定一批规则

如果一个方法, 在所有的子类中都进行了重写, 那么这个方法在父类中怎么实现, 就没什么意义了。
此时, 如果实现了这个方法, 显得冗余; 如果不定义这个方法, 则表示所有的子类对象都没有了这个方法。
针对这样的情况, 我们可以将这样的方法定义成抽象方法。

抽象方法的特点

  • 抽象方法只有方法的声明, 没有实现。
  • 抽象方法只能定义在抽象类中。

抽象类的继承

抽象方法有一个特点, 就是只能定义在抽象类中。 如果一个非抽象子类继承自一个抽象父类, 此时, 可以继承到抽象父类中的抽象方法。 那么这个时候, 抽象方法就存在于一个非抽象的子类中了。 此时会有问题。
所以, 非抽象的子类, 在继承自一个抽象父类的时候, 必须重写实现抽象父类中所有的抽象方法或者将自己也变成抽象类
注意:抽象类不能直接创建对象,可以通过子类间接的创建对象.

抽象类总结

基本点

  • 抽象类不一定有抽象方法,但是有抽象方法的一定是抽象类.
  • 继承了抽象类的子类一定要实现抽象方法,如果不实现就只能将自己也变成抽象的.
  • 抽象类不能直接创建对象,必须通过子类实现,所以抽象类一定有子类

比较普通类与抽象类

  • 普通类可以直接创建对象
  • 抽象类可以有抽象方法

比较:abstract,static,private,final

  • 三个都是不能与abstract同时存在的关键字
  • final:被final修饰的类不能有子类,方法不能重写,但是abstract必须有子类,必须重写
  • static:修饰的方法可以通过类名调用,abstract必须通过子类实现
  • private:修饰的方法不能重写,abstract必须重写

抽象类的使用场景

非抽象类在继承自一个抽象父类的同时,必须重写实现父类中所有的抽象方法。
因此,抽象类可以用来做一些简单的规则制定。

在抽象类中制定一些规则,要求所有的子类必须实现,约束所有的子类的行为

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值