我是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);
}
}
答案 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)
超类中的方法是继承的,因为它可用于子类,但它不会自动调用。在子类中,您可以调用超类的方法,以便它可以执行任何操作,然后您的方法执行任何其他工作(就像在您的示例中一样。
以下是一个可以为您提供更多信息的参考资料:
答案 5 :(得分:1)
您覆盖超类方法 - 就像您要替换它一样。 您可以选择调用超类方法,但您不必这样做。这一切都取决于你想要完成的事情。在某些情况下,您希望调用超类方法,因为您需要子类的逻辑,您要添加的perharps。在其他情况下,您可能希望完全替换该行为。
答案 6 :(得分:1)
原始的onCreate()
方法是继承的,但是这个确切的方法不是这个代码所做的。此代码需要原始方法,并且还需要调用setContentView(R.layout.main);
。它不是在这里复制超类中的所有代码,而只是调用super.onCreate()
然后添加新内容。