【问题标题】:Difference between super and ((parent)this)? [duplicate]超级和((父)这个)之间的区别? [复制]
【发布时间】:2017-03-14 21:58:51
【问题描述】:

超级关键字相关的疑问。

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(); 无法调用父类 show()?请对此作出适当的解释。

【问题讨论】:

  • 您可能应该修复代码的缩进,然后有人会回答您的问题。
  • 如果你可以调用方法(因为它是在父类中定义的),那么将this指针转换为超类有什么意义,所以你可以只使用this.show();,@987654330 @ 或只是 show() !?除非您在子类中覆盖了 show 方法,否则 super.show() 会调用父类而不是本地类。
  • ((Base)this).show(); //Doesnt invokes parent show() method.Why?.. 什么是Base?应该是((Parent)this).show()
  • 你在Child.show() 中调用((Parent) this).show(); (我认为这是你想要的)仍然会命中Child.show(),所以这是一个递归调用(导致无限递归)。我认为这回答了你的问题。
  • "不调用父 show() 方法。为什么?"出于同样的原因,调用这个:Integer integer = Integer.valueOf(0); System.out.println(((Object) integer).toString()); 不会调用 Object.toString()

标签: java


【解决方案1】:

构造函数链 在 Java 中,关键字 this 表示当前对象,当一个类扩展另一个类时,它的超类引用变量可能包含您代码中的子类引用变量 ((Parent)this).x

super关键字用于直接调用超类构造函数及其变量。

同时super类变量持有子类对象,当我们使用super时它引用同一个对象。

如何在 Java 中从另一个构造函数调用一个构造函数或什么 是Java中的构造函数链接是Java中的棘手问题之一 采访。好吧,你可以使用这个关键字来调用一个构造函数 如果你想调用同一个类的另一个构造函数 来自基类或超类的构造函数,那么你可以使用 super 关键词。从另一个调用一个构造函数称为构造函数 Java中的链接。构造函数可以自动相互调用或 显式使用 this() 和 super() 关键字。 this() 表示一个 同一类的无参数构造函数,super() 表示否 父类的参数或默认构造函数。还拥有多个 同一类中的构造函数称为构造函数重载 Java。

阅读更多:http://www.java67.com/2012/12/how-constructor-chaining-works-in-java.html#ixzz4bJ5C069o

【讨论】:

    【解决方案2】:

    在真正的Child 对象上调用((Parent) this).show(); 会导致调用Child.show()。无论您是通过myObject.show() 还是通过this 执行此操作,对于调用哪个版本的方法都没有区别——它始终是由对象的运行时类型确定的方法,在本例中为Child

    所以你有一个递归调用,导致无限递归。

    另一方面,super.show() 调用超类中的方法,在本例中为Parent

    【讨论】:

      猜你喜欢
      • 2015-09-02
      • 1970-01-01
      • 2021-03-27
      • 1970-01-01
      • 2019-06-23
      • 2014-11-01
      • 2013-07-01
      • 1970-01-01
      • 2016-06-21
      相关资源
      最近更新 更多