Java向上向下转型详解

 更新时间:2022年09月19日 08:36:56   作者:#define微光  
这篇文章主要为大家详细介绍了Java向上向下转型,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

Java之所以可以向上向下转型是依据Java三大特性之一的多态性,而转型就是对象的多态性,需要注意的是转型的前提是方法覆写

转型:

[自动,90%] (1)对象的向上转型:父类 父类对象 = 子类实例

[强制,1%]   (2)对象的向下转型:子类 子类对象 = (子类) 父类实例

观察向上转型

package TestOverride;
 
/**
 * Author:weiwei
 * description:向上转型
 * Creat:2019/3/29
 **/
 
class Person{
    public void print(){
        System.out.println("1.我是爸爸!");
    }
}
class Student extends Person{
    public void print(){
        System.out.println("2.我是儿子!");
    }
}
public class Test {
    public static void main(String[] args) {
        Person per = new Student();//向上转型
        per.print();
    }
}

运行结果:

2.我是儿子!
 
Process finished with exit code 0

运行结果只打印了子类print方法的内容,因为向上转型将子类对象变为父类对象,调用了子类的print方法

向下转型指的是将父类对象变为子类对象,但在这之前我们需要明确:为什么我们需要向下转型?当你需要子类扩
充操作的时候就要采用向下转型 

观察向下转型(存在安全隐患)

package TestOverride;
 
/**
 * Author:weiwei
 * description:向下转型
 * Creat:2019/3/29
 **/
 
class Person{
    public void print(){
        System.out.println("1.我是爸爸!");
    }
}
class Student extends Person{
    public void print(){
        System.out.println("2.我是儿子!");
    }
    public void fun(){
        System.out.println("只有儿子有!");
    }
}
public class Test {
    public static void main(String[] args) {
        Person per = new Person();
        per.print();
        //这个时候父类能够调用的方法都是本类定义好的方法
        //所以并没有Student类中的fun()方法,那么只能够进行向下转型处理
        Student stu = (Student) per;
        stu.fun();
    }
}

并不是所有的父类对象都可以向下转型,如果要想进行向下操作之前,一定要首先发生向上转型,否则在转型时会出现 ClassCastException 。
观察错误转型

Person per = new Person(); //父类对象
Student stu = (Student) per; //强转

如果向下转型存在安全隐患,那么如何转型才靠谱呢?最好的做法就是先进行判断,而后在进行转型,那么就可以依instanceo关键字实现,该关键字语法如下:

子类对象 instanceof类,返回boolean类型

观察instanceof操作

Person per = new Student();
        System.out.println(per instanceof Person);
        System.out.println(per instanceof Student);
        if (per instanceof Student) { //避免ClassCastException
           Student stu = (Student) per ;
           stu.fun();
       }

这种转换到底有什么意义?

要求定义一个方法,这个方法可以接收Person类的所有子类实例,并调用Person类的方法。

package TestOverride;
 
/**
 * Author:weiwei
 * description:向下转型
 * Creat:2019/3/29
 **/
 
class Person{
    public void print(){
        System.out.println("1.我是人类!");
    }
}
class Student extends Person{
    public void print(){
        System.out.println("2.我是学生!");
    }
}
class Worker extends Person{
    public void print(){
        System.out.println("3.我是工人!");
    }
}
public class Test {
    public static void main(String[] args) {
        whoAre(new Student());
        whoAre(new Worker());
    }
    public static void whoAre(Person per){
        per.print();
    }
}

通过以上分析就可以清楚,对象的向上转型有一个最为核心的用途:操作参数统一。

多态性总结:

  • 对象多态性的核心在于方法的覆写。
  • 通过对象的向上转型可以实现接收参数的统一,向下转型可以实现子类扩充方法的调用(一般不操作向下转型,有安全隐患)。
  • 两个没有关系的类对象是不能够进行转型的,一定会产生ClassCastException。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 使用spring容器在初始化Bean时前和后的操作

    使用spring容器在初始化Bean时前和后的操作

    这篇文章主要介绍了使用spring容器在初始化Bean时前和后的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • Java Web程序中利用Spring框架返回JSON格式的日期

    Java Web程序中利用Spring框架返回JSON格式的日期

    这里我们来介绍一下Java Web程序中利用Spring框架返回JSON格式的日期的方法,前提注意使用@DatetimeFormat时要引入一个类库joda-time-版本.jar,否则会无法访问相应路径
    2016-05-05
  • java如何完成输出语句实例详解

    java如何完成输出语句实例详解

    输入输出可以说是计算机的基本功能,下面这篇文章主要给大家介绍了关于java如何完成输出语句的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-01-01
  • Java中Stream流的常用方法代码示例

    Java中Stream流的常用方法代码示例

    这篇文章主要介绍了Java中Stream流的常用方法代码示例,Stream类中每一个方法都对应集合上的一种操作,将真正的函数式编程引入到Java中,能 让代码更加简洁,极大地简化了集合的处理操作,提高了开发的效率和生产力,需要的朋友可以参考下
    2023-10-10
  • Mybatis参数(Parameters)传递方式

    Mybatis参数(Parameters)传递方式

    这篇文章主要介绍了Mybatis参数(Parameters)传递方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • java 完全二叉树的构建与四种遍历方法示例

    java 完全二叉树的构建与四种遍历方法示例

    本篇文章主要介绍了java 完全二叉树的构建与四种遍历方法示例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-03-03
  • Java单例模式的线程安全,饿汉和懒汉模式详解

    Java单例模式的线程安全,饿汉和懒汉模式详解

    这篇文章主要为大家详细介绍了Java单例模式的线程安全,饿汉和懒汉模式。文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-02-02
  • 使用Spring处理x-www-form-urlencoded方式

    使用Spring处理x-www-form-urlencoded方式

    这篇文章主要介绍了使用Spring处理x-www-form-urlencoded方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • Java 多线程实例详解(三)

    Java 多线程实例详解(三)

    本文主要介绍 java 线程安全的知识,这里整理了相关资料及实现示例代码,有兴趣的小伙伴可以参考下
    2016-09-09
  • Java中IdentityHashMap与HashMap区别详解

    Java中IdentityHashMap与HashMap区别详解

    这篇文章主要介绍了Java中IdentityHashMap与HashMap区别详解,很多人不晓得IdentityHashMap的存在,其中不乏工作很多年的Java开发者,他们看到就说是第三方jar包,实际上它是Jdk源码自带的集合类,需要的朋友可以参考下
    2023-11-11

最新评论