如何在Java中实现超级?

时间:2012-02-23 15:37:51

标签: java inheritance jvm superclass super

实际定义“超级”的地方? [当我们使用super.someMethod()]时。它被定义为java.lang.Object类或java.lang.Class类中的字段吗?

当我们从子类调用时,super包含对它的超类的引用。以同样的方式,超类本身中的super引用了它的超类[以这种方式upto java.lang.Object]。那么,java如何将超类引用注入“超级”字段,这使我们能够调用超类方法?

是否有如下所述的实施方案:

    Class current = this.getClass();
    Class parent = current.getSuperclass();
    System.out.println("name is =" + parent);

5 个答案:

答案 0 :(得分:15)

super这样的{p> this是一个关键字。它在Java中有一个含义,它没有反映在Java字节代码中。这意味着我的父类的实现(可以继承)

在字节代码级别,它将显式调用其父类的方法。

答案 1 :(得分:2)

super是一个特定于对象引用的关键字,它从调用对象开始提升对象层次结构,直到找到具有匹配方法签名或属性/字段的祖先对象。请参阅Java documentation

答案 2 :(得分:2)

这不是一个字段 - 它是language keyword

当然,在JVM级别有对超类的引用,但在Java级别上,您只能通过关键字访问它。不同之处在于您实际上无法通过引用访问超类方法 - 它需要编译器的特殊支持才能执行此操作。当然没有super.super

答案 3 :(得分:1)

  

它是否定义为java.lang.Object类或java.lang.Class类中的字段?

根本不是一个领域。

super.someMethod()是一个Java语法元素,表示“调用我的超类中定义的方法”。


好的,假设假设 是一个字段。它的类型是什么?它会指的是什么?如果它被声明为:

Class<ParentClass> super = ... // the relevant class object.

然后super.someMethod()无效,因为:

  • Class没有任何用户定义的方法,
  • super.someMethod()需要调用实例方法,而我们不提供合适的实例。

另一方面,如果它被声明为:

ParentClass super = this;

然后super.someMethod()将等同于this.someMethod(),并且会调用此类中的方法,而不是重写。

答案 4 :(得分:0)

我想它会开始攀登祖​​先链,直到找到第一个拥有你追随超级方法的类。似乎是最简单的方法。如果你考虑一下,这是在编译时完成的。最后一个方法只是一个函数指针,有一个invokation方法接受有问题的实例(在你的情况下它是this)。查看Method.invoke文档

编译器将使用来自超类的Method实例,并将其作为Object实例