实际定义“超级”的地方? [当我们使用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);
答案 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实例