在Java中使用多态时,是否存在对象的隐式转换?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Java中使用多态时,是否存在对象的隐式转换?相关的知识,希望对你有一定的参考价值。

假设我有3个班级:

  • 超级课程是:Animal
  • 有一个继承Dog的子类Animal
  • 有一个继承Cat的子类Animal

现在,如果我这样做:Animal a = new Dog();

Qazxswpoi指向Dog的对象a

如果是,那么这会将变量和对象都投射到狗身上吗?

Animal

在Java中转换这些引用类型的规则是什么?

答案

我将尝试描述背景中发生的事情,希望它能清除某些事情。让我们将这个声明和定义分解成几部分。

  1. 'a'被宣布为动物。
  2. 'a'被定义为狗。
  3. Dog扩展Animal,因此,动物方法(包括构造函数)得到定义。
  4. 定义Dog的方法,同时覆盖由父类Animal定义的任何方法,并掩盖父类的成员变量。

当查看'a'时,您正在使用'Animal'视角,因此您无法使用仅由Animal的子类声明的任何方法(或字段)。为了“获得”这种观点,你可以完全像你一样从动物到狗。请记住,向下转换是不安全的,而向上转换是不安全的。

例如:

((Dog)a).bark(); // bark() is specific for the Dog

通常,一个好的做法是为Animal创建一个抽象类,然后用子类覆盖它的一些方法。例如:

Animal a = new Cat(); // cats can mew
Animal b = new Dog(); // dogs can bark
(Dog)b.bark() // Unsafe but compiles and works.
(Dog)a.bark() // Unsafe but compiles and throws a run time exception. 

以上是关于在Java中使用多态时,是否存在对象的隐式转换?的主要内容,如果未能解决你的问题,请参考以下文章

为啥Java在使用“加号”运算符时会执行从双精度到整数的隐式类型转换? [复制]

C++,bool 转换是不是总是退回到 void* 的隐式转换?

Scala 学习笔记之隐式参数和隐式转换并用

C的隐式类型转换

JavaScript的数据类型的隐式转换

scala学习笔记-隐式转换与隐式参数(18)