Noob关于“Hello World”Android教程的问题

时间:2011-09-09 07:04:38

标签: android

刚开始使用Android开发和Java。所以,这是我正在使用的代码:

package com.example.helloandroid;

import android.app.Activity;
import android.os.Bundle;

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

这里声明onCreate()方法的目的是什么:

public void onCreate(Bundle savedInstanceState) {

然后使用super来调用onCreate()方法:

super.onCreate(savedInstanceState);

这是不是意味着您从Activity类而不是HelloAndroidActivity类调用onCreate()方法?如果是这样,在HelloAndroidActivity类中声明一个具有相同名称的方法有什么意义呢?

感谢您的任何澄清。

5 个答案:

答案 0 :(得分:15)

在您的示例中,HelloAndroidActivity是一个继承自Activity的类。然后,您将覆盖基类(Activity)的onCreate方法。当您在派生类中使用与基类中的现有方法相同的签名定义方法时,会发生覆盖。这意味着当我在onCreate的实例上调用HelloAndroidActivity时,我将执行HelloAndroidActivity版本,而不会基类(Activity )的版本。

重写版本中的指令super.OnCreate(savedInstanceState)显式调用方法的基类版本。这意味着你希望HelloAndroidActivity.onCreate首先执行基类的实现,然后再运行一些代码。


采用以下示例来说明此行为(假设方法Output只是向屏幕输出内容):

1

class A
{
    public void DoSomething()
    {
        Output("A");
    }
}

在这种情况下,调用A.DoSomething()将输出“A”。


2

假设我们仍然按上面定义的类A和以下内容:

class B extends A
{
}

在这种情况下,调用B.DoSomething()也会输出“A”。


3

假设我们仍然按上面定义了类A,而是改为:

class B extends A
{
    @Override
    public void DoSomething()
    {
        Output("B");
    }
}

现在,调用B.DoSomething()将输出“B”。


4

假设我们仍然按上面定义的类A,现在改为:

class B extends A
{
    @Override
    public void DoSomething()
    {
        super.DoSomething();
        Output("B");
    }
}

现在,调用B.DoSomething()将输出“A”,然后输出“B”。

答案 1 :(得分:2)

您正在创建一个继承自Activity的类;但你必须定义它的行为,所以你告诉你的类,在创建时,调用基类来完成所有必须完成的事情(super.onCreate()),然后你设置你的布局来显示你的屏幕/应用程序( setContentView())。

还有一件事:看看@Override之前定义的public void onCreate(Bundle savedInstanceState):覆盖意味着您扩展基本方法让您的派生类完成所有工作基础的,包括(后)你的逻辑。

答案 2 :(得分:2)

问题:在这里声明onCreate()方法的目的是什么? 答案:oncreate()方法类似于使用JAVA中的main(String args [])。您的Activity启动时会调用oncreate活动。所以所有的初始化都应该用这种方法完成。

您写道:公共类HelloAndroidActivity扩展活动 这意味着您正在创建一个类 - “HelloAndroidClass”,它继承自class =“Activity”。

您写道: super.onCreate(savedInstanceState); Java使用关键字“super”从父类调用构造函数。您正在使用覆盖的概念。运行代码时,将执行基类“HelloAndroidActivity”的oncreate方法,而不是父类的“Activity类”。

所以你的代码将首先运行oncreate()方法的基类实现(super.oncreate(...))然后执行派生类。

问题:在HelloAndroidActivity类中声明具有相同名称的方法有什么意义? 答案:super关键字用于初始化对象。重新声明相同方法并使用覆盖的重点是,您可以避免重写基类代码。

答案 3 :(得分:1)

onCreate是普通Java中的main(String[] args)函数。这是您设置代码的地方。

答案 4 :(得分:0)

来自onCreate方法的文档:

  

派生类必须调用超类的此方法的实现。如果他们不这样做,将抛出异常。

请参阅更多here了解活动方法,生命周期等。