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() {
}
}