超级关键字相关疑问。
class Parent{
int x=40;
void show()
{
System.out.println("Parent");
}
}
class Child extends Parent
{ int x=20;
void show() //method overriding has been done
{
System.out.println(super.x); // prints parent data member
System.out.println(((Parent)this).x); /*same output as previous statement which means super is similar to (Parent)this*/
System.out.println("child");
super.show(); // invokes parent show() method
((Parent)this).show(); //Doesnt invoke parent show() method.Why?
}
public static void main(String s[])
{
Child c1=new Child(); //Child class object
c1.show();
}}
因此,System.out.println(super.x)
和System.out.println(((Parent)this).x)
打印相同的值。如果super.show()
调用父类show()
方法,那么为什么((Parent)this).show();
无法调用父{ {1}}?请告诉我们适当的解释。
答案 0 :(得分:1)
构造函数链接
在Java中,关键字this
表示当前对象,当一个类扩展另一个类时,其超类引用变量可以保存代码中的子类引用变量((Parent)this).x
,
while super
关键字用于直接调用超类构造函数及其变量。
同时super
类变量包含子类对象,当我们使用super时它引用相同的对象。
如何从Java中的另一个构造函数调用一个构造函数或什么 是Java中的构造函数链接是Java中棘手的问题之一 访谈。好吧,您可以使用此关键字来调用一个构造函数 来自同一个类的另一个构造函数,如果你想调用一个 基于类或超类的构造函数然后你可以使用super 关键词。从其他调用一个构造函数称为Constructor 用Java链接。构造者可以自动或相互呼叫 明确使用this()和super()关键字。 this()表示a 同一类的无参数构造函数和super()表示否 父类的参数或默认构造函数。也有多个 同一个类中的构造函数称为构造函数重载 Java的。
了解详情:http://www.java67.com/2012/12/how-constructor-chaining-works-in-java.html#ixzz4bJ5C069o
答案 1 :(得分:0)
在真正的((Parent) this).show();
对象上调用Child
会导致Child.show()
被调用。无论您是以myObject.show()
还是通过this
执行此操作,对于调用哪个版本的方法都没有区别 - 它始终是由对象的运行时类型确定的方法,在本例中为Child
。
所以你有一个递归调用,导致无限递归。
另一方面, super.show()
调用超类中的方法,在本例中为Parent
。