JavaSE面向对象_多态

什么是多态

Java中的多态,指的是同一个父类引用指向不同子类对象时,调用同名的成员方法,根据指向具体子类对象的不同,体现的行为也随之不同,表现出不同的状态,这就称之为多态(polymorphic)。多态是面向对象三大特征之一,基于继承实现,而多态的本质就是方法的重写。

 

多态发生的条件

  1. 必须存在继承,多态一定发生在父子类之间。
  2. 必须存在方法的重写,不同的子类需要重写父类中的同名方法。
  3. 必须存在父类引用指向子类对象。(代码书写条件)

反之,如下场景不能发生多态:

  1. 由于多态需要继承,被final修饰的类不能被继承,自然就没有多态。
  2. 由于多态需要方法重写,不能被重写的方法就没有多态:
    • 私有方法
    • 静态方法
    • 构造方法
    • final修饰的方法

 

多态的访问特征

多态的访问形式:用父类引用指向子类对象,然后用引用名访问成员。访问时的情况如下。

同名成员变量

成员变量的访问是没有多态现象的,当父子类存在同名成员变量时,表现出属性的隐藏。“对象名.成员变量”访问时,访问范围(编译时)看引用,访问结果(运行时)看引用。

 

同名成员方法

多个子类同时重写了父类中的一个方法,并出现父类引用指向不同子类对象,用“对象名.成员方法”调用同名方法时,方法的调用结果就体现出多态的特点,访问范围(编译时)看引用,调用结果(运行时)看对象。

 

多态的优缺点

多态的优点

  1. 要实现多态必须要继承,而继承提高了代码的复用率,提升了程序的可维护性。
  2. 用父类引用指向不同子类对象,只需要调用同名方法,就能根据不同子类对象,得到不同的行为。简化了代码,提升了程序的扩展性。

多态的缺点

父类引用指向子类对象,限制了子类对象的功能(访问范围),意味着子类独有的成员是无法使用父类引用访问的。

 

类型转换

向上转型(自动类型转换)

方法的形参和方法调用时,传入的实参数据类型只需要能够自动类型转换到形参数据类型即可,也就是向上转型。如果方法的形参是一个父类类型,那么方法调用时,传入的实参对象可以是子类类型。同样,方法的具体返回值和方法的返回值类型,也同样具有允许自动类型转换的特点。这决定了多态的优点,也是多态的典型应用之一。

 

向下转型(强制类型转换)

根据多态的缺点,当我们用一个父类引用指向子类对象时,是不能够访问子类独有的行为的,这是由于父类引用限制了访问范围。如果我们需要使用这些子类独有的行为时,就需要把父类引用转换为子类引用,属于向下转型,是强制类型转换。

强制类型转换的基本前提

  1. 引用数据类型能够做类型转换的前提是存在继承,且必须发生在同一条继承链中的两个类之间,否则会编译报错。
  2. 强转必须是把父类引用,转换成它的子类引用,否则会编译报错。
  3. 能够通过编译的强转,不意味着一定能够强转成功正常运行,当代码中出现不合适的强转时,会导致程序报错,抛出类型转换异常ClassCastException。

所以,强制类型转换成功的条件是:强转后的引用,要真的能够指向父类引用所指向的对象。

什么是“真的能够指向”:

因为引用决定了访问范围,父类引用可以指向子类对象,而子类引用不可以指向父类对象。所以强转后的引用,要么就是父类引用指向的对象的类型,要么就是父类引用指向的对象的父类类型(父类引用指向的子类对象的类型是可以转的最小“辈分”)

 

instanceof关键字

强制类型转换是“危险的”,稍有不慎就会导致程序报错,抛出异常。所以,我们在做强转时,需要使用instanceof关键字来判断是否能够做强转。

语法

引用名 instanceof 类名

解释

instanceof用于判断,左边引用所指向的对象,是否是后面类名的对象或者子类对象。

该语法会返回一个布尔值

  • 如果左边的引用指向的对象是右边类名的对象或子类对象,则返回true
  • 如果左边的引用指向的对象不是右边类名的对象或子类对象,则返回false

当该语法返回true时,表示左边的引用能够强转为后面类名的引用,常用于if的条件判断。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值