gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 11:51:41 24 4
gpt4 key购买 nike

假设我有 3 节课:

  • 父类(super class)是:Animal
  • 有 1 个子类 Dog 继承 Animal
  • 有 1 个子类 Cat 继承了 Animal

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

a 指向的对象 Dog 是否会转换为 Animal

如果是,那么这会将变量和对象都转换为狗吗?

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

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

最佳答案

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

  1. “a”被声明为动物。
  2. “a”被定义为狗。
  3. Dog 扩展了 Animal,因此定义了动物方法(包括构造函数)。
  4. Dog 的方法被定义,同时覆盖父类 Animal 定义的任何方法并覆盖父类的成员变量。

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

例如:

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.

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

public abstract class Animal {
abstract void makeNoise();
}


public class Dog extends Animal {
void makeNoise(){
System.out.println("bark");
}
}


public class Cat extends Animal {
void makeNoise(){
System.out.println("mew");
}
}

关于java - 在Java中使用多态性时是否存在对象的隐式转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47840396/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com