【问题标题】:Dynamic Method invocation (Objects and reference in inheritance )动态方法调用(继承中的对象和引用)
【发布时间】:2014-10-17 14:20:30
【问题描述】:

假设我有 2 个类 ........A 类是基类,B 类是派生类,如果我创建一个引用,例如:A a=new B();,这是否意味着引用 @987654325 @ 指向 B Class 的对象?如果是,那么我如何能够在 B 中调用 A 的重写方法而不是 B 的其他方法?提前谢谢你

class A {
    m1() {
    }
}

class B extends A {
    m1() {
    }

    m2() {
    }
}


 A a=new B();
 a.m1(); //it will call overridden m1() in B 
 a.m2(); //it doesnt work if reference "a" points to object of B than why doesnt it call         m2 method ? 

【问题讨论】:

  • 我建议您阅读 Polymorphism 上的 Oracle 教程。
  • 当然还有 ((B)a).m2()
  • 请注意,对于属性而不是方法,这是一个完全不同的故事 :-)
  • @Leo 如果你能解释一下,属性有什么不同会很感激:)
  • @Code-Apprentice 非常感谢老兄......现在阅读它

标签: java class object inheritance dynamic


【解决方案1】:
Animal a=new Dog(); // Animal is parent - class, Dog is a child

意味着,您有一个指向 Dog 对象的动物引用。因此,只有在父类(Animal)中声明的方法才能使用父类引用来调用。

在你的情况下,m2() 没有在Class A 中定义,它只在class B 中定义,所以,使用A 的引用,你不能调用m2()

【讨论】:

  • "并在子类 (Dog) 中被覆盖" 这不是必需的。您可以调用Animal 中未被Dog 覆盖的方法。
  • 这里有一个建议的编辑,可能会让你的意思更清晰(更简洁)。
  • 如果你的引用变量是 Animal 类型,你可以调用 Animal 类的方法,但不能调用 Dog 类的方法
【解决方案2】:

如果是,我怎么能在 B 中调用 A 的重写方法而不是 B 的其他方法

因为引用的类型为A。编译器只能强制调用这种类型的方法。

【讨论】:

  • 好吧,我想我明白了,所以它和我想的不完全一样!我认为引用变量指向对象,因此可以调用任何方法,但引用变量是 A 类型,因此编译器不知道除 A 之外的任何其他方法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-27
  • 1970-01-01
相关资源
最近更新 更多