Java向上转型与向下转型

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类特有的方法");
    }
}

总结

向上造型是为了多态的实现,向下造型是对向上造型无法使用子类特有方法与属性缺陷的补充

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值