【问题标题】:calling method in super class using object of sub class how it work?使用子类的对象在超类中调用方法它是如何工作的?
【发布时间】:2017-02-25 02:29:22
【问题描述】:
class SuperClass{  
  public void print(){
    System.out.println("I'm super class...");
  }  
  public void someMethod(){
    System.out.println("any thing");
  }
}  

class SubClass extends SuperClass{ 
  @Override
  public void print(){
    System.out.println("I'm sub class...");
  }  

  public static void main(String args[]){  
    SuperClass a=new SubClass(); 
    a.print();  
    a.someMethod();
  }  
}  

a.print() 称为动态绑定,它知道在运行时调用哪个方法并选择 SubClass 的方法,因为对象是 SubClass 是真的吗?

a.someMethod()JVM如何处理这个不在子类中的方法和子类中的对象?

【问题讨论】:

    标签: java inheritance casting polymorphism dynamic-binding


    【解决方案1】:

    a.print()method overriding 的一个示例,即runtime polymorphism。也就是说,在运行时它决定是调用子类方法还是超类方法(这里你的SubClass 方法被调用,因为它被覆盖并匹配参数签名)。

    someMethod() 调用的情况下,您还没有在您的子类中定义它。这意味着,当您从Superclass 继承someMethod() 时,您的SubClass 自动获得someMethod(),因为它是public。简单来说,SubClass 也有someMethod() 的定义。这就是 JVM 是如何知道要调用哪个方法的。

    同样在SuperClass a 中,变量“a”将存储在堆栈中,而引用将存储在堆中。您已经使用SubClass 的构造函数构造了引用。这意味着堆栈中的变量“a”指的是堆中的“SubClass”对象。这就是为什么'a'能够调用someMethod

    【讨论】:

    • 为什么我们不能从子类中调用方法,尽管我们从子类创建对象并将其地址保存在超类变量中??
    【解决方案2】:

    当你这样做时:

    SuperClass a = new SubClass();
    

    您是说要创建SubClass 的实例,而您只希望SuperClass 中声明的方法可见。如果您在 SubClass 中声明了任何新方法,它们将不可见。

    如果可以(即当您覆盖它们时),该对象仍将使用 SubClass 实现。未被覆盖的方法将使用继承的实现。

    【讨论】:

      【解决方案3】:

      “使用子类的对象在超类中调用方法”是Polymorphism in Java的场景之一。

      如果子类实现了与父类定义相同的方法,用子类的对象调用该方法会用子类的方法覆盖父类的方法。

      因此,如果你想用子类的对象调用超类的方法,不要重写该方法。

      SuperClass a=new SubClass();
      

      此定义使“a”能够引用类型 SuperClass 或任何扩展 SuperClass 的子类。由于对象“a”是从子类创建的,根据定义,对象可以访问子类和超类的方法。这个解释应该解决你的两个问题。

      参考java文档here

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-05-03
        • 1970-01-01
        • 2010-10-28
        • 1970-01-01
        • 1970-01-01
        • 2017-05-13
        • 2014-03-22
        • 1970-01-01
        相关资源
        最近更新 更多