super()在这做什么

时间:2014-02-10 09:27:50

标签: java android

我正在浏览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()调用直接父类构造函数 - >这我知道

父类是Object。所以构造函数将返回什么。意味着返回对象的属性是什么。?

8 个答案:

答案 0 :(得分:5)

super()必须位于subclass constructor内的第一个语句中,它会调用parent constructor

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

}

答案 1 :(得分:3)

它什么都不做。

这是对父构造函数的调用,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,所以你实际上不需要打电话给超级。

public final class Av implements android.widget.AdapterView.OnItemClickListener {

    final ChooserActivity a;

    public Av(ChooserActivity chooseractivity) {
        this.a = chooseractivity;

    }
}

您应该阅读Understanding Java Constructors

答案 2 :(得分:2)

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

答案 3 :(得分:1)

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

试试这个:

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

OR

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

答案 4 :(得分:1)

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

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

有关stackoverflow的super()的更多内容:

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

答案 5 :(得分:0)

我猜您的代码出错了。这样做的原因是,无论何时调用baseclass的构造函数,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.
    }
}

答案 6 :(得分:0)

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

答案 7 :(得分:0)

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