Java引用类型的转换
前言
以下文章仅个人的理解,仅供参考。若有不正之处,欢迎指出!qq:2530318393
一、引用的转换有几种?
与基本类型变量类似,Java的引用类型变量的转换分为:
大类型转小类型(需要进行手动强转,也叫向下转型或向下造型)
小类型转大类型(不需要强转,也叫向上转型或向上造型)
二、向上转型
1、什么是向上转型?
简言:就是一个大类型的引用指向一个小类型的对象。那么这里的大小怎么理解呢?基本数据类型可以通过值来判断大小,而引用则是通过他们之间的继承关系来判断。被继承的大于继承的,通俗点你老爸能代表你,他就比你“大”。
具体的转换格式为:父类类型 引用变量 = new 子类对象构造;
在Java中,由于所有的类都直接或者间接(继承的传递性)的继承Object类,所以:Object o = new 任意非Object类名();都是成立的,这就是向上造型。
不理解的可以参照基本类型的自动类型转换结合理解。
基本数据类型:对一个大类型的变量进行赋值一个小类型的值。
引用类型 :对一个大类型的变量进行赋值一个小类型的对象的地址值,其实代表的也就是个“值”,只是这个值是
一个地址,想要让它指向的对象的地址,引用所代表的就是这个对象!
2、向上转型有什么用?
讲到向上转型的运用,那就是多态了。首先简单的说:多态就是同一种物体有多种行为,多种状态。
那么,向上造型怎么体现多态的呢?我们知道,向上转型的引用与对象之间的关系是直接继承或者间接继承!那么,当父类的方法被子类重写时,我们的对象在执行时执行的是子类的方法!但是引用变量(当是所指向对象的超类时)想要将子类的方法点出来,那么父类也必须要有这个方法。所以向上造型的多态一般都与重写结合完成。
举例:某校企合作,学校要求:我要你们公司的讲师给我们学生讲Java的全套开发流程的课。然后公司有一个讲师部门(超类),下面有很多的员工(员工),具体有:讲Java基础的、API的、SE的、EE的···。然后直接一辆车(创建一个数组)就拉去学校了,然后让所有讲师开始干活--------讲课(超类具有的行为),再然后各个员工开始讲自己擅长的课程(重写超类的讲课行为)。最后执行时只管啪!一个循环遍历,然后引用点方法就完事了,省去了单独创建一大堆员工对象,省去了把每个员工对象都点执行对应的方法写一遍。
程序示例:
public class Test {
public static void main(String[] args) {
Teacher [] teachers = new Teacher[4];
teachers[0] = new TeacherBasis(); //向上造型
teachers[1] = new TeacherSE(); //向上造型
teachers[2] = new TeacherEE(); //向上造型
teachers[3] = new TeacherAPI(); //向上造型
for (int i = 0; i < teachers.length; i++) {
teachers[i].teach(); //多态运用
}
}
}
abstract class Teacher{
public abstract void teach();
}
class TeacherBasis extends Teacher{
public void teach() {//重写
System.out.println("我教Java语言基础");
}
}
class TeacherAPI extends Teacher{
public void teach() {//重写
System.out.println("我教JavaAPI");
}
}
class TeacherSE extends Teacher{
public void teach() {//重写
System.out.println("我教JavaSE");
}
}
class TeacherEE extends Teacher{
public void teach() {//重写
System.out.println("我教JavaEE");
}
}
二、向下转型
1、什么是向下转型:
向下转型的前提是向上转型。向下转型就是用一个小于当前引用类型,但是大于等于(引用所指向)对象类型的引用类型变量来指向本对象。
转换格式:派生类 引用变量名 = (超类类名)超类引用
2、向下转型有什么用?
在用多态解决问腿时,不可能所有的子类都有共同的行为,那么当某个类有自己独有的行为,其超类下的其余子类都不具有时,我们不可能将这个行为抽象到父类,所以当想要使用某个子类所特有的方法时,就要让它“做回自己”,因为编译器在编译时,方法能不能用看的是左边的引用,所以父类没有肯定不能引出来,就需要将类型转小,然后引出它特有的方法进行执行。但是向下转型是有可能发生类型转换异常的(当强转为的类型小于对象类型时)。所以一般都要用instanceof来判断想要强转的对象是否是某个类型或某个类型的父类。
instanceof用法:对象或一个指向对象的引用 instanceof 类,返回值是boolean类型的,当右边的类是对象的所在类或者其超类时为true,为派生类时为false,为其它无继承关系类时编译报错
程序示例:Test继承Object,Test1继承Test,Other继承Test1
public class Test {
public static void main(String[] args) {
Object o = new Test1();//对象的超类的超类的向上转型
System.out.println(o instanceof Test); // true
//o.show(); //无法使用
Test t = (Test) o; //对象的超类的向下转型
//t.show(); //无法使用
Test1 t1 = (Test1) t; //对象类本身的向下转型
t1.show(); //可以使用
System.out.println(t1 instanceof Other);//false
//Other ot = (Other) t1; //报错:ClassCastException
}
int t = 0;
}
class Other
extends Test1 //删掉时程序7行语法报错
{
}
public class Test1 extends Test{
public void show(){
System.out.println("我是test1类特有的方法");
}
}
总结
向上造型是为了多态的实现,向下造型是对向上造型无法使用子类特有方法与属性缺陷的补充