装箱和拆箱、强制类型转换和向上自动转型、多态以及三者之间的关系(Java小白向)

装箱和拆箱、强制类型转换和向上自动转型、多态以及三者之间的关系(Java小白向)

文章目录

  • 装箱和拆箱、强制类型转换和向上自动转型、多态以及三者之间的关系(Java小白向)
    • 问题原型:
    • 1 装箱和拆箱
    • 2 强制类型转换和向上自动转型
    • 3 多态
    • 总结

问题原型:

装箱和拆箱是为了简化基本数据类型的包装类之间的运算而设计的特性吗?强制类型转换和向上自动转型是什么?上述问题之间有什么关系吗?

1 装箱和拆箱

装箱是通过对应包装类构造器来实现的,是基本数据类型到包装类对象。拆箱是通过该包装类对象的XXXvalue()方法来是实现的,是包装类对象到基本数据类型。
自动拆箱和装箱则省略了上述步骤,允许基本数据类型和包装类对象的直接互相赋值。
示例代码如下:

/* 自动装箱和拆箱*/

Object boolObj = true;
// 装箱:构造器接受对应基本数据类型变量参数创建对象
Boolean B = Boolean(boolObj);
// 拆箱:取出包装类对象中的基本数据类型的值
boolean b = B.booleanValue();
// 自动装箱和拆箱
Boolean B = boolObj;
b = B;

需要注意,待拆箱的包装类对象必须和待赋值变量的数据类型一致,如果不一致,则拆箱可能报错,通常伴随if语句+强制类型转换来避免这种异常。

/* ClassCastException异常处理*/

Object boolObj = true;
// 拆箱可能报错,如下代码出现强制类型转换异常
// boolean b = boolObj;
// 强制类型转换的正确用法
if (boolObj instanceof Boolean)
{
	boolean b =(Boolean)boolObj;
}

2 强制类型转换和向上自动转型

强制类型转换和向上自动转型(upcasting)是不同类型的对象和引用类型变量赋值过程中两种不同情况下的概念。当把子类对象赋值给父类引用变量的时候,涉及到的是向上自动转型,这种转型无需强制类型转换,总是成功,由系统自动完成;当把父类对象赋值给子类引用变量时,此时不存在向上自动转型的特性,需要通过强制类型转换符将父类对象的引用类型强制转换为子类变量类型,然后再进行赋值,否则会出现ClassCastException异常。
上述代码可以看到,Object对象boolObj必须通过强制类型转换转化为Boolean变量再自动拆箱为boolean变量;还有一种赋值运算代表着Java的向上自动转型特性,即子类对象可以直接赋值给父类变量。
例如:

// 向上自动转型
boolean b = ture;
Object boolObj = b;

3 多态

强制类型转换的本质是继承和多态,多态依托于继承,强制类型转换依托多态性。
Java引用变量有两个类型,一个是编译时类型,一个是运行时类型。编译时类型由声明该变量时的类型决定,运行时类型由实际赋给该变量的对象类型决定。当编译时类型与运行时类型不同时,就会出现所谓的多态,即编译时类型相同的引用变量,在调用同一个方法时呈现出多种不同的行为特征。
那么什么时候编译时类型和运行时类型不同呢?这就又要提到向上自动转型了。Java允许把一个子类对象直接赋给一个父类引用变量,而无须任何类型转换。这样一来,该父类引用变量在运行时的实际类型为子类型。
示例如下:

/*
*  BaseClass:基类
*  SubClass:子类
*  baseMethod():基类的一般方法
*  baseOnlyMethod():基类特有的未被重写的方法
*  overrideMethod():子类重写的父类的方法
*  subOnlyMethod():子类特有的方法
*/

// 运行时类型为SubClass子类型,出现多态
BaseClass ploymophicBc = new SubClass();
// 多态调用父类方法
ploymophicBc.baseOnlyMethod();
ploymophicBc.baseMethod();
// 多态调用子类重写方法
ploymophicBc.overrideMethod();
// 因编译时类型为BaseClass父类,所以编译阶段无法通过下述语句
ploymophicBc.subOnlyMethod();

如上最后代码所示,尽管该父类引用变量运行时的类型是SubClass类型包含subOnlyMethod方法,但在编译阶段却只能调用其编译时父类BaseClass所具有的方法。

具有多态性的引用变量的编译时类型只能是父类变量,且只能调用父类中存在的方法(无论是否被重写),无法直接调用子类型变量(可以通过反射来执行,这个放到下一篇随笔中)。

总结

写下来这么一篇东西,好像才刚刚开始了解多态。
关系上来看,这三者之间没有必然的层次包含关系,更像是交叉关系;从属性上看,多态是高级特性,自动拆装箱属于一般特性,而强制类型转换和自动向上转型属于底层基本特性,是支撑Java高级特性的重要基础;从应用上看,后两者基本上属于开发必须掌握的基础,前者则会在特定场景下才会用到。整体而言,对个人来说是理解Java基础特性的一次随笔总结吧。收获颇丰。

参考文档:《疯狂Java讲义》

你可能感兴趣的:(Java)