【问题标题】:What does super() do here [closed]super() 在这里做什么[关闭]
【发布时间】:2014-02-10 09:27:49
【问题描述】:

我正在通过一个 android 恶意软件中的一段代码来了解它的工作原理。 av 类定义如下

public final class av implements android.widget.AdapterView.OnItemClickListener {
    final ChooserActivity a;
    public av(ChooserActivity chooseractivity) {
        super();
        a = chooseractivity;
    }
    ...Other methods here
}

super() 调用直接父类构造函数 -> 我知道这个

父类是对象。所以构造函数会返回什么。表示返回对象的属性是什么?

【问题讨论】:

  • 没什么,它不应该编译。 super 必须是第一个语句。
  • 反正super调用了超类的构造函数。

标签: java android


【解决方案1】:

super()必须在subclass constructor内的第一条语句中,它调用parent constructor

public av(ChooserActivity chooseractivity)
{
    super();
    a = chooseractivity;

}

【讨论】:

    【解决方案2】:

    它什么都不做。

    是对父构造函数的调用,ac的父构造函数是Object。

    Object 是你的对象扩展的默认类,它的构造函数什么都不做。 (实际上没有)

    您还必须调用super() 作为构造函数的第一行,并且按照惯例,您应该使用大写字符来命名您的类。

    public final class Av implements android.widget.AdapterView.OnItemClickListener {
    
        final ChooserActivity a;
    
        public Av(ChooserActivity chooseractivity) {
            super();
            this.a = chooseractivity;
    
        }
    }
    

    但是因为你扩展的类是Object 你实际上不需要调用super。

    public final class Av implements android.widget.AdapterView.OnItemClickListener {
    
        final ChooserActivity a;
    
        public Av(ChooserActivity chooseractivity) {
            this.a = chooseractivity;
    
        }
    }
    

    您可能应该阅读Understanding Java Constructors

    【讨论】:

      【解决方案3】:

      您列出的代码无效,无法编译。对 super() 的调用必须是构造函数中的第一条语句。它用于在您继续构建自己之前构建您正在扩展的对象。

      【讨论】:

        【解决方案4】:

        此代码将甚至无法编译。记住构造函数调用必须是构造函数中的第一条语句。

        试试这个:

        public av(ChooserActivity chooseractivity) {
            // Call the base class constructor. Should be the firs
            super();
            a = chooseractivity;
        }
        

        或

        public av(ChooserActivity chooseractivity) {
           // Compiler will give implicit call to the base class contructor
            a = chooseractivity;
        }
        

        【讨论】:

          【解决方案5】:

          super() 关键字调用父构造函数,即av 所继承的类的构造函数。在这种情况下,您没有明确给出父类,因此您最终会得到默认父类 Object。

          在这种特殊情况下,super() 将在那里做的是 break,因为在 Java 中调用 super() 而不是构造方法的 第一行 是非法的。这是因为在子(更具体的)对象之前构造父(更基本的)对象是没有意义的。

          更多关于 super() 在 stackoverflow 上的信息:

          super() in Java When do I use super()?

          【讨论】:

            【解决方案6】:

            我猜你的代码出错了。这样做的原因是,每当您调用基类的构造函数时,super() 必须是方法中的第一行。如下所示,

            public final class av implements android.widget.AdapterView.OnItemClickListener
            {
            
                final ChooserActivity a;
            
                public av(ChooserActivity chooseractivity)
                {
                    super();                     // must be in first line.
                    a = chooseractivity;
                }
            }
            

            但是,如果您在这种情况下调用基类的方法,则 super 可以在任何行中。

            public final class av implements android.widget.AdapterView.OnItemClickListener
            {
            
                final ChooserActivity a;
            
                public void Test(ChooserActivity chooseractivity)
                {
                    a = chooseractivity;
                    super.Test();                     // No need to be declare in first line.
                }
            }
            

            【讨论】:

              【解决方案7】:

              Super 必须是第一个语句,因为它是要调用的超类的正确构造函数。可能不止一个,但 super() 是默认调用的,因此没有必要显式调用它。当您需要传递参数时,您可能需要调用 super。

              【讨论】:

                【解决方案8】:

                构造函数调用必须是构造函数中的first语句。 所以 super() 应该在开头

                【讨论】:

                  猜你喜欢
                  • 2017-11-12
                  • 1970-01-01
                  • 2011-01-28
                  • 2012-03-20
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多