20、多态自动类型转换和强制类型转换笔记

多态

代码中常见的方法入参比如cutAction(Person person){
person.cut();
}
这个参数为Person类引用,我们在调用这个方法的时候要传入具体的实现类才行,Person即中文翻译过来为人类是一个抽象的对象,因为人类是所有人的一个抽象称呼,而人是形形色色的,我们以生活中的例子医生和理发师为例,都属于人类,这个符合is a的关系,所以可以说人类是这些类的超类。
医生的cut()方法可以是做手术,理发师的cut()方法为剪头发。这就是具体的实现,当传入不同的实现类的时候,调用不同的对象的cut()方法;

以下示例代码和上面说明的有所不同,cut()抽象方法申明在Skill接口中,而Person类实现Skill接口,医生和理发师分别继承Person类,并重写了cut()方法…

/**
 * @Author Xu Debu
 * @ClassName: PACKAGE_NAME
 * @Description:
 * @Date 2020/2/5
 */

/**
 * 人类
 */
public class Person implements Skill{
    @Override
    public void cut() {
        System.out.println("is Person skill...");
    }

    public static void main(String[] args) {
        Person pDoctor=new Doctor();
        pDoctor.cut();//手术
        Person pHair=new Hairdresser();
        pHair.cut();//剪头发
    }
}

/**
 * 医生
 */
class Doctor extends Person {
    @Override
    public void cut() {
        System.out.println("手术");
    }
}

/**
 * 理发师
 */
class Hairdresser extends Person{
    @Override
    public void cut() {
        System.out.println("剪头发");
    }
}

/**
 * 技能
 */
interface Skill{
    void cut();
}

1.向上造型/自动类型转换

1.1)超类型的引用指向派生类的对象(白话:引用为超类,new的对象为派生类)
1.2)能造型成为的类型有: 超类+所实现的接口
1.3)能点出来什么,看引用的类型(白话:人类是抽象的,而派生类医生可以派生出很多属性和行为,如果造型为人类的话必然导致属性和行为的缺失)

2.强制类型转换

成功条件只有两个
2.1)引用所指向的对象,就是该类型(白话:引用类型就是实例化对象Person p=new Person())
2.2)引用所指向的对象,实现该接口或继承的该类
转时若不符合如上两个条件,则发生ClasfsCastException类型转换异常

案例:
自己写了一个案例,下面是这个案例的uml图

在这里插入图片描述
可以从图中看出,Boo和Coo是Aoo的子类,Boo实现Inter1接口,所以new Boo()的对象和Aoo及Inter1符合转换标准,new Coo()和Aoo符合强转标准.
而instanceof关键字则用于类型判断,如果判断为true,则是同一类型,可以进行转换,代码如下:

package com.fjnx.history.instanceofs;

//多态得演示
public class MultiTypeDemo {

    public static void main(String[] args) {
        /*自动类型转换*/
        Aoo o=new Boo();//超类型的引用指向派生类的对象(向上造型)
        Inter1 i=new Boo();//接口的引用指向实现的对象
        System.out.println(o instanceof Inter1);
        System.out.println(o instanceof Boo);

        /*强制类型转换*/
        Boo o1=(Boo)o;//引用所指向的对象,就是该类型
        Inter1 o2=(Inter1)o;//引用所指向的对象,实现该接口
        Coo o3=(Coo)o;//new Boo()对象不是Coo类型,会导致类造型异常报错
        if(o instanceof Coo) {//instanceof对类型先进行检查,左侧为对象,右侧为类型
            Coo o4=(Coo)o;
        }
    }
}
interface Inter1{
}

class Aoo{
    public Aoo() {
    }
}

class Boo extends Aoo implements Inter1{
    public Boo() {
    }
}

class Coo extends Aoo{
    public Coo() {
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值