返回顶部
首页 > 资讯 > 后端开发 > Python >学习Java之如何正确地向上转型与向下转型
  • 350
分享到

学习Java之如何正确地向上转型与向下转型

Java向上转型与向下转型Java向上转型Java向下转型 2023-05-19 14:05:51 350人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

目录一. 类型转型二. 向上转型1. 概念2. 特点3. 语法4. 案例三. 向下转型1. 概念2. 特点3. 语法4. 案例四. 结语一. 类型转型 将一个类型转换成另一个类型的过

一. 类型转型

将一个类型转换成另一个类型的过程被称为类型转换。 我们所说的对象类型转换,一般是指两个存在继承关系的对象,而不是任意类型的对象。如果两个类型之间没有继承关系,就不允许进行类型转换,否则会抛出强制类型转换异常(java.lang.ClassCastException)。
Java语言允许某个类型的引用变量引用子类的实例,而且可以对这个引用变量进行类型转换。Java中引用类型之间的类型转换(前提是两个类是直接或间接的父子关系)主要有两种,分别是向上转型(upcasting)和向下转型(downcasting)

我们先来看下面这张图:

猫、狗、牛、羊都是动物,所以”动物“是父类,猫狗牛羊是具体的子类。我们可以说猫是动物,狗是动物,牛是动物,羊是动物,这个结论肯定没错!但如果我们说,动物是猫,动物是狗,动物是牛,动物是羊,这个结论一定正确吗?那可就不一定了。子类肯定符合父类类型,但反之,父类不一定符合子类类型

接下来分别对向上转型和向下转型进行讲解。

二. 向上转型

1. 概念

所谓的向上转型,就是父类引用指向子类的对象,也就是把子类对象直接赋给父类引用变量,此时不用强制转换。比如我们说猫是动物,狗是动物,牛是动物,羊是动物,这就是把子类当成父类来用。父类是子类的上级,我们直接把子类向上提拔转型了。

2. 特点

向上转型具有如下特点:

  • 编译类型取决于=号左边,运行类型取决于=号右边;
  • 子类可以调用父类的所有成员,但需遵守访问权限;
  • 父类不能调用子类的特有成员;
  • 最终的运行效果取决于子类的具体实现。

3. 语法

向上转型的基本语法如下所示:

//左侧是父类引用变量,右侧是创建的子类对象,我们可以把它当作父类使用

父类类型 引用名 = new 子类类型();

4. 案例

接下来我们通过一个案例来演示向上转型该如何实现。


public interface Animal {
    //叫
    public void speak();
}

//Dog类实现Animal接口
public class Dog implements Animal {
    @Override
    public void speak() {
	System.out.println("狗子:汪汪");
    }
}

//Cat类实现Animal接口
public class Cat implements Animal {
    @Override
    public void speak() {
	System.out.println("猫子:喵喵");
    }
}

//定义一个测试类
public class AnimalTest {
    public static void main(String[] args) {
	//向上转型
	//父类引用dog变量,指向子类对象new Dog();
        //动物 = 狗;以下代码的意思就是”狗是动物“
	Animal dog=new Dog();
        //向上转型后,可以使用父类Animal中的属性和方法。
	dog.speak();

	//Animal animal=new Cat();效果等同于如下两行代码:
	Cat cat=new Cat();
	Animal animal=cat;
	animal.speak();
    }
}

我们在进行向上转型时,可以写成Animal animal=new Cat(); Animal animal=cat;的形式。就是先创建出cat对象,然后再将cat对象赋值给Animal类型的变量,这样就实现了向上转型。因为Animal是父级类型,Cat是子级类型,Cat是Animal的子类,所以可以直接将cat变量赋值给animal,这就是向上转型。但这种写法比较繁琐,我们通常是直接采用Animal cat=new Cat();的形式,简洁明了。

我们之所以可以实现向上转型,主要是因为两个类型之间是父子关系。比如在本例中,向上转型就等于说”猫是动物,狗是动物“,因为猫狗都是动物的子类,所以这个结论是确定无误的。

三. 向下转型

1. 概念

向下转型则反之,也就是一个已经向上转型的子类对象指向父类引用。 向下转型后,可以调用子类类型中所有的成员。向下转型时,必须进行强制类型转换。因为父类拥有的成员,子类肯定会有,但子类拥有的成员,父类不一定有。

但要注意,如果父类的引用对象指向的是子类对象,则向下转型时是安全的,即编译时不会出现错误。但如果父类的引用对象是父类本身,那么在向下转型的过程中是不安全的,虽然编译时不会出错,但在运行过程中会出现强制类型转换异常。我们可以使用instanceof运算符来避免出现强制类型转换异常。

2. 特点

向下转型具有如下特点:

  • 只能强制转换父类的引用,不能强制转换父类的对象;
  • 父类的引用必须指向子类目标类型的对象;
  • 向下转型后,父类可以调用子类类型中的所有成员。

3. 语法

向下转型的基本语法如下所示:

//向下转型使用强制类型转换的格式,将父类引用类型转换为子类引用类型

子类类型 引用名 = (子类类型) 父类引用;

4. 案例

接下来我们在上面的案例基础之上,对代码进行改造,在Cat类中增加一个新的方法。

public class Cat implements Animal {
    @Override
    public void speak() {
	System.out.println("猫子:喵喵");
    }

    //给其他动物打招呼
    public void helloAnimal(Animal animal) {
	//向下转型,将父类型转为子类型。
	//此时有可能会出现ClassCastException类型转换异常,因为子类一定属于父类的一员,但父类不一定属于子类。
	//我们说“猫是动物”一定没问题,但如果说“动物是猫”,这个结论未必正确。所以把“动物强转成猫”的过程中,有可能会出现异常。
	//只有两者之间具有明确的父子关系时才能进行强转,否则就会出现类型转换异常。
		
	//向下转型时需要进行类型强转
	Cat cat=(Cat) animal;
        //向下转型后,可以使用子类Cat中的属性和方法。
	cat.speak();
    }
}

//测试类
public class AnimalTest {
    public static void main(String[] args) {
	Animal animal=new Cat();
	animal.speak();
		
	Cat cat=new Cat();
        //这里我们传参时,既可以传递animal,也可以传递cat,但不能传递dog类型,否则会出现java.lang.ClassCastException: 
	//因为class com.yyg.convert.Dog cannot be cast to class com.yyg.convert.Cat。狗不能被转成猫
	//cat2.helloAnimal(dog);
	cat.helloAnimal(animal);

        //Dog dog = new Dog();
	//这里就会编译出错,不允许把Dog对象类型转换成Cat对象类型
	//Cat cat = (Cat)dog;    
    }
}

向下转型就是将父类型转为子类型,但要注意,此时有可能会出现ClassCastException类型转换异常,因为子类一定属于父类的一员,但父类不一定属于子类。我们说“猫是动物”一定没问题,但如果说“动物是猫”,这个结论未必正确。所以把“动物强转成猫”的过程中,有可能会出现异常。只有两者之间具有明确的父子关系时才能进行强转,否则就会出现类型转换异常。

就比如上面的案例中,我们传参时,既可以传递animal,也可以传递cat,但不能传递dog类型,否则会出现java.lang.ClassCastException,因为class com.yyg.convert.Dog cannot be cast to class com.yyg.convert.Cat,狗类不能被转成猫类。

四. 结语

至此,就把类型转换给大家介绍完了,我们来看看类型转换的要点吧::

  • 向上转型是父类引用指向子类的对象,不必强制类型转换 
  • 向下转型是子类对象指向父类引用,必须进行强制类型转换;
  • 可以强制向下转型最好借助instanceOf进行类型判断;

以上就是学习Java之如何正确地向上转型与向下转型的详细内容,更多关于Java向上转型与向下转型的资料请关注编程网其它相关文章!

--结束END--

本文标题: 学习Java之如何正确地向上转型与向下转型

本文链接: https://lsjlt.com/news/213419.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 学习Java之如何正确地向上转型与向下转型
    目录一. 类型转型二. 向上转型1. 概念2. 特点3. 语法4. 案例三. 向下转型1. 概念2. 特点3. 语法4. 案例四. 结语一. 类型转型 将一个类型转换成另一个类型的过...
    99+
    2023-05-19
    Java向上转型与向下转型 Java向上转型 Java向下转型
  • Java怎么正确的向上转型与向下转型
    在Java中,向上转型和向下转型是用来处理父类与子类之间的关系的。 向上转型:将一个子类的对象转换为父类的对象。这样可以实现父类引...
    99+
    2024-03-01
    Java
  • java向上转型与向下转型详解
    本文实例为大家分享了java向上转型与向下转型的具体代码,供大家参考,具体内容如下 基础知识:Java中的继承机制使得一个类可以继承另一个类,继承的类称为子类,被继承的类称为父类。在...
    99+
    2024-04-02
  • Java向上向下转型详解
    Java之所以可以向上向下转型是依据Java三大特性之一的多态性,而转型就是对象的多态性,需要注意的是转型的前提是方法覆写 转型: [自动,90%] (1)对象的向上转型:父类 父类...
    99+
    2024-04-02
  • Java中向上转型与向下转型的区别有什么
    Java中向上转型与向下转型的区别有什么?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。 Java 向上转型和向下转型的详解转型是在继承的基础上而言的,继承是面向对象语...
    99+
    2023-05-31
    java ava 向上转型
  • Java向上转型和向下转型的区别说明
    目录向上转型和向下转型的区别1.代码实现2.实现向下转型3.此时执行程序简单认识向上转型和向下转型向上转型:父类引用指向子类对象向下转型:子类引用指向父类对象向上转型和向下转型的区别...
    99+
    2024-04-02
  • java向上转型和向下转型的概念是什么
    Java中的向上转型(Upcasting)和向下转型(Downcasting)是指对象在继承关系中的类型转换。向上转型是指将子类对象...
    99+
    2023-09-14
    java
  • 使用Java和Laravel,如何在对象之间快速地转换数据类型?
    在软件开发中,对象之间的数据类型转换是非常常见的操作。在Java和Laravel中,都提供了强大的数据类型转换工具,可以帮助开发者快速地完成数据类型转换。本文将介绍如何在Java和Laravel中使用数据类型转换工具,快速地将对象之间的数...
    99+
    2023-06-23
    laravel 对象 numy
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作