欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-04-30 15:33:34
...

多态

代码中常见的方法入参比如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图

20、多态自动类型转换和强制类型转换笔记
可以从图中看出,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() {
    }
}
相关标签: 知识总结