【问题标题】:does implicit typecasting takes place in java, when super class reference is pointing to sub class object?当超类引用指向子类对象时,隐式类型转换是否发生在java中?
【发布时间】:2017-03-22 05:34:42
【问题描述】:

当超类引用指向子类对象时,jvm类型在执行过程中是否将对象从子类型转换为超类型并将其存储在引用变量中?

class Animal {

void bark() {
    System.out.println("Animal is barking");
  }
}

class Dog extends Animal{

void bark() {
    System.out.println("Dog is barking");
  }
}

public class DynamicBinding {

  public static void main(String[] args) {

    Animal a = new Dog();  //does implicit type casting happens at this line?
    a.bark();
  }

}

【问题讨论】:

  • 我不相信,不。至少在大多数情况下,编译器会静态分析您的代码并确定不需要强制转换。如果需要,它会坚持你手动添加它。因此,我不相信 JVM 会在运行时不断检查对象以确保它们的类型是正确的。
  • 您不需要将类型强制转换为其超类型。 new B() 定义为A
  • Dog 扩展了 A 或 Animal 类和 A a = new B();Animal a = new Dog(); ?

标签: java casting type-conversion


【解决方案1】:

不,你这里没有使用 Dog 的接口,你使用的是 Animals 的接口。这意味着,例如,如果 Dog 类有另一个 Animal 类没有的方法,如“run”,那么您将无法在此处使用它。

我想说的是:根本没有隐式或显式类型转换

【讨论】:

    【解决方案2】:

    这是多态中的向上转型。下面的行是这样说的:

    Animal a = new Dog();
    

    您使用超类接口,但实现在子类中。即,您可以在 a 引用上使用 Animal 类中的方法,但该方法的实现是在 Dog 类中。

    【讨论】:

    • 所以我们可以将其称为隐式类型转换,b'coz 由编译器完成吗? @mustafacil
    猜你喜欢
    • 2012-10-02
    • 2014-02-28
    • 1970-01-01
    • 2015-02-26
    • 2013-01-15
    • 2013-08-09
    • 1970-01-01
    • 1970-01-01
    • 2010-10-18
    相关资源
    最近更新 更多