super和((parent)this之间的区别?)

时间:2017-03-14 13:23:29

标签: java

超级关键字相关疑问。

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}}?请告诉我们适当的解释。

2 个答案:

答案 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