如何准确区分Java中的向上转型与向下转型技巧?

2026-05-15 22:171阅读0评论SEO资源
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计2361个文字,预计阅读时间需要10分钟。

如何准确区分Java中的向上转型与向下转型技巧?

目录一. 类型转换 1. 概念 2. 特点 3. 语法 4. 案例二. 向上转换 1. 概念 2. 特点 3. 语法 4. 案例三. 向下转换 1. 概念 2. 特点 3. 语法 4. 案例四. 总结 1. 类型转换简介

目录
  • 一. 类型转型
  • 二. 向上转型
    • 1. 概念
    • 2. 特点
    • 3. 语法
    • 4. 案例
  • 三. 向下转型
    • 1. 概念
    • 2. 特点
    • 3. 语法
    • 4. 案例
  • 四. 结语

    一. 类型转型

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

    我们先来看下面这张图:

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

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

    二. 向上转型

    1. 概念

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

    2. 特点

    向上转型具有如下特点:

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

    3. 语法

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

    //左侧是父类引用变量,右侧是创建的子类对象,我们可以把它当作父类使用 父类类型 引用名 = new 子类类型();

    如何准确区分Java中的向上转型与向下转型技巧?

    4. 案例

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

    /** * @author 一一哥Sun * 定义父类---向上与向下转型 */ 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();的形式,简洁明了。

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

    三. 向下转型

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

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

    向下转型具有如下特点:

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

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

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

    接下来我们在上面的案例基础之上,对代码进行改造,在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向上转型与向下转型的资料请关注自由互联其它相关文章!

    本文共计2361个文字,预计阅读时间需要10分钟。

    如何准确区分Java中的向上转型与向下转型技巧?

    目录一. 类型转换 1. 概念 2. 特点 3. 语法 4. 案例二. 向上转换 1. 概念 2. 特点 3. 语法 4. 案例三. 向下转换 1. 概念 2. 特点 3. 语法 4. 案例四. 总结 1. 类型转换简介

    目录
    • 一. 类型转型
    • 二. 向上转型
      • 1. 概念
      • 2. 特点
      • 3. 语法
      • 4. 案例
    • 三. 向下转型
      • 1. 概念
      • 2. 特点
      • 3. 语法
      • 4. 案例
    • 四. 结语

      一. 类型转型

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

      我们先来看下面这张图:

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

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

      二. 向上转型

      1. 概念

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

      2. 特点

      向上转型具有如下特点:

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

      3. 语法

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

      //左侧是父类引用变量,右侧是创建的子类对象,我们可以把它当作父类使用 父类类型 引用名 = new 子类类型();

      如何准确区分Java中的向上转型与向下转型技巧?

      4. 案例

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

      /** * @author 一一哥Sun * 定义父类---向上与向下转型 */ 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();的形式,简洁明了。

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

      三. 向下转型

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

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

      向下转型具有如下特点:

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

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

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

      接下来我们在上面的案例基础之上,对代码进行改造,在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向上转型与向下转型的资料请关注自由互联其它相关文章!