1

一般来说,我是 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);
    }
}
4

7 回答 7

11

为什么我必须从超类调用 onCreate 方法?它不是从超类继承的吗?

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

这不是构造函数调用——除非你显式调用超类实现,否则它的代码根本不会被执行。与构造函数不同的是,超类实现调用不必是方法的第一条语句。您可以随心所欲地调用超类实现,甚至可以多次调用。

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

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()的。你可以从子类调用任何方法的超类实现。)

于 2012-11-19T23:06:59.287 回答
7

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

onCreate()不是构造函数。这是一种方法。如果您覆盖该方法并且不调用super.onCreate(),则重新定义该onCreate()方法的作用。调用super.onCreate()使您的onCreate()方法与基本方法执行相同的操作onCreate(),以及特定于您自己的活动的其他操作。

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

于 2012-11-19T23:06:49.607 回答
2

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

于 2012-11-19T23:09:56.757 回答
1

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

这样做的“OOP”-ish 原因是类中的onCreate方法Activity可能包含应由子类的实现调用的某些代码。不过,您不必调用它(Java 语言而言)。

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

于 2012-11-19T23:07:15.580 回答
1

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

这是一个参考,它将为您提供更多信息:

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

于 2012-11-19T23:09:07.527 回答
1

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

于 2012-11-19T23:09:27.320 回答
1

原来的onCreate()方法是继承的,但是那个确切的方法不是这段代码所做的。此代码需要原始方法,并且还需要调用setContentView(R.layout.main);. 它不是从这里复制超类的所有代码,而是简单地调用super.onCreate()然后添加新的东西。

于 2012-11-19T23:09:50.113 回答