Вопрос Noob о учебнике Android «Hello World»

Просто начните с разработки 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); 

Разве это не означает, что вы вызываете метод onCreate () из класса Activity, а не класса HelloAndroidActivity? Если да, то в чем смысл объявления метода с тем же именем в классе HelloAndroidActivity?

Спасибо за любое разъяснение.

onCreate – это своего рода main(String[] args) функция main(String[] args) в нормальной Java. Здесь вы настраиваете свой код.

В вашем примере HelloAndroidActivity – это класс, который наследуется от Activity . Затем вы переопределяете метод onCreate базового класса ( Activity ). Переопределение происходит, когда вы определяете метод в производном классе с той же сигнатурой, что и существующий метод в базовом классе. Это означает, что когда я вызываю 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() также 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».

Вы создаете класс, который наследуется от Activity ; Но вы должны определить его поведение, поэтому вы сообщаете вашему классу, когда он создан, для вызова базового класса для завершения всех вещей, которые должны быть выполнены ( super.onCreate() ), затем вы устанавливаете свой макет для отображения вашего экрана / приложения ( setContentView() ).

Еще одно: взгляните на @Override заданный прямо перед public void onCreate(Bundle savedInstanceState) : переопределение означает, что вы расширяете базовый метод, чтобы ваш производный класс выполнял всю работу базового, включая (после) вашу логику ,

Вопрос: Какова цель объявления метода onCreate () здесь? Ответ. Метод oncreate () аналогичен основному (String args []) в ususal JAVA. Активность oncreate вызывается, когда начинается ваша активность. Поэтому все инициализации должны быть выполнены в этом методе.

Вы пишете: public class HelloAndroidActivity extends Activity Это означает, что вы создаете класс – HelloAndroidClass, который наследуется от класса = «Активность».

Вы пишете: super.onCreate (savedInstanceState); Java использует ключевое слово «super» для вызова конструкторов из родительского класса. Здесь вы используете концепцию переопределения. Когда вы запускаете свой код, выполняется метод oncreate базового класса «HelloAndroidActivity», а не родительский класс – «Класс активности».

Таким образом, код сначала запускает реализацию базового класса метода oncreate () (super.oncreate (…)), а затем реализацию производного класса.

Вопрос: В чем смысл объявления метода с тем же именем в классе HelloAndroidActivity? Ответ. Ключевое слово super используется для инициализации объектов. Точкой повторного использования одного и того же метода и с использованием переопределения является то, что вы сохраняетесь от перезаписи кода базового класса.

Из документации по методу onCreate:

Производные классы должны обращаться к реализации этого класса суперкласса. Если они этого не сделают, будет выбрано исключение.

Подробнее см. Здесь о методах работы, жизненном цикле и т. Д.