为什么在覆盖现有方法时调用超类方法?

时间:2012-11-19 23:01:46

标签: java android

我是JAVA和OOP的新手。在这个非常简单的代码中,为什么我必须从超类中调用onCreate方法?它不是从超类继承而来的吗?我知道构造函数方法不会继承到子类,如果要调用构造函数,则必须调用超类。 super.onCreate是构造函数调用吗?构造函数名称是否必须与类名相同? 我知道这是一个愚蠢的问题,谢谢你的答复。

import android.app.Activity;

public class MainActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
}

7 个答案:

答案 0 :(得分:9)

  

为什么我必须从超类中调用onCreate方法?是不是继承自超类?

实现是继承的,但是你要覆盖它。您需要表明您不只是想替换原始行为 - 您希望从超类然后额外代码执行该行为。

这不是构造函数调用 - 除非您显式调用超类实现,否则其代码将不会被执行。与构造函数不同,超类实现调用不必是方法的第一个语句。您可以在任何地方调用超类实现,甚至多次。

这是一个简短但完整的示例程序,演示了调用super方法之间的区别,而不是:

class Super {
    void method1() {
        System.out.println("Super.method1");
    }

    void method2() {
        System.out.println("Super.method2");
    }
}

class Sub extends Super {
    @Override void method1() {
        // No explicit super call
        System.out.println("Sub.method1");
    }

    @Override void method2() {
        super.method2();
        System.out.println("Sub.method2");
    }
}

public class Test {
    public static void main (String[] args) {
        Super x = new Sub();
        x.method1(); // Prints just Sub.method1
        x.method2(); // Prints Super.method2 and Sub.method2
    }    
}

Sub.method1顺便调用super.method2()是完全可行的。你可以从子类中调用任何方法的超类实现。)

答案 1 :(得分:7)

因为这就是android团队如何设计Activity。活动的onCreate()方法为每个创建的活动执行必须执行的操作,而不是调用super.onCreate()会绕过这些必需的操作。

onCreate()不是构造函数。这是一种方法。如果您覆盖该方法但未调用super.onCreate(),则会重新定义onCreate()方法的功能。致电super.onCreate()会使您的onCreate()方法与基本onCreate()方法做同样的事情,以及您自己的活动特有的其他内容。

有关此方法的文档,请参阅http://developer.android.com/reference/android/app/Activity.html#onCreate%28android.os.Bundle%29

答案 2 :(得分:2)

是的,它是相同的方法名称,因此您将覆盖Activity中的onCreate方法。如果你不在MainActivity中重新调用该方法,它只会执行setContentView(R.layout.main);

答案 3 :(得分:1)

这与构造函数无关,实际上(此外,关于构造函数未被调用的语句在默认构造函数的情况下不正确)。

“OOP” - 这样做的原因是onCreate类中的Activity方法可能包含某些代码,应该由子类的实现调用 。但是,你没有来调用它(就Java语言而言)。

要知道是否应该调用超类的方法实现,您应该参考超类的实现文档。这里没有对错;绝对是一个个案的事情。

答案 4 :(得分:1)

超类中的方法是继承的,因为它可用于子类,但它不会自动调用。在子类中,您可以调用超类的方法,以便它可以执行任何操作,然后您的方法执行任何其他工作(就像在您的示例中一样。

以下是一个可以为您提供更多信息的参考资料:

http://docs.oracle.com/javase/tutorial/java/concepts/

答案 5 :(得分:1)

您覆盖超类方法 - 就像您要替换它一样。 您可以选择调用超类方法,但您不必这样做。这一切都取决于你想要完成的事情。在某些情况下,您希望调用超类方法,因为您需要子类的逻辑,您要添加的perharps。在其他情况下,您可能希望完全替换该行为。

答案 6 :(得分:1)

原始的onCreate()方法是继承的,但是这个确切的方法不是这个代码所做的。此代码需要原始方法,并且还需要调用setContentView(R.layout.main);。它不是在这里复制超类中的所有代码,而只是调用super.onCreate()然后添加新内容。