Оглавление:
Видео: Урок 3. Первое андроид-приложение. Структура android проекта. Создание эмулятора Android (AVD) 2025
Если класс Java не сломан, не исправляйте его. Предположим, вы хотите добавить функциональность к существующему классу Java. Вам нравится класс активности Android, но предварительно объявленный класс Activity ничего не отображает на экране. Вы переписываете класс активности Android? №
Вместо того, чтобы переписывать существующий класс, вы расширяете класс. Даже в Android-приложении «Hello» ничего не делать, вы пишете
public class MyActivity extends Activity
Затем в объявлении класса MyActivity вы пишете
@Override public void onCreate (Bundle savedInstanceState) {супер. OnCreate (savedInstanceState); setContentView (R. layout. main);}
Класс MyActivity создает новые функциональные возможности, расширяя большинство функциональных возможностей Android Android, переопределяя метод класса «умный мертвый» класса Activity.
Окончательные классы Java
В объектно-ориентированном программировании расширение класса - это самая благородная вещь, которую вы можете сделать.
Но некоторые классы не предназначены для расширения. Возьмем, к примеру, класс String Java. Строка String - это строка. Вы не хотите, чтобы кто-то MyString. чтобы вернуть длину времени, необходимого для скремблирования символов строки. Для предотвращения того, что кто-то делает что-то неожиданное, нетрадиционное или необычное с помощью методов строки, создатели Java сделали класс String окончательным:
public final class String
Некоторые из предварительно объявленных классов Android также являются окончательными, в том числе Телефония и MediaStore.
Абстрактные классы Java
Так же, как последний класс ненавидит быть расширенным, абстрактный настаивает на расширении. Android ViewGroup является примером абстрактного класса.
public abstract класс ViewGroup {public void bringChildToFront (просмотр дочернего элемента) {int index = indexOfChild (child); if (index> = 0) {removeFromArray (index); addInArray (child, mChildrenCount); ребенок. mParent = this;}} protected abstract void onLayout (boolean changed, int l, int t, int r, int b);}
Android Group ViewGroup. java-файл имеет длину более 3 700 строк. Таким образом, этот пример содержит лишь небольшую часть кода файла. Но вы можете видеть, как класс становится абстрактным. Ни для кого не удивляет, слово abstract предшествует классу слов. Но абстрактное слово также начинает объявление некоторых методов, принадлежащих классу.
Учредители Android решили, что идея ViewGroup полезна. Они были правильными, потому что ваши любимые макеты Android (LinearLayout, RelativeLayout и т. Д.) Являются подклассами ViewGroup.Они также поняли, что из одного вида ViewGroup в другой некоторые функции не меняются. Например, приведенный выше пример определяет метод bringChildToFront, а подклассы ViewGroup наследуют этот метод.
Но основатели также поняли, что некоторые аспекты ViewGroup не имеют смысла, если вы не работаете с определенной группой. Например, LinearLayout позиционирует вещи один за другим, а RelativeLayout позиционирует вещи сверху, снизу и сбоку друг от друга. Таким образом, код выше не имеет полномасштабного метода onLayout.
Объявление onLayout не имеет тела метода. Но Android требует, чтобы каждый подкласс класса ViewGroup объявлял свой собственный метод onLayout. Java применяет это требование, когда вы объявляете метод onLayout абстрактным.
Как разработчик вы не можете создать объект из абстрактного класса. Если вы пишете
ViewGroup group = new ViewGroup ();
Java говорит вам, что вы плохо себя чувствуете. Чтобы сделать что-то полезное с классом ViewGroup, вам нужен подкласс класса ViewGroup. Подкласс имеет конкретную версию каждого абстрактного метода в классе ViewGroup:
package com. allmycode. образцы; импорт андроида. содержание. Контекст; импорт андроида. Посмотреть. ViewGroup; public class MyLayout extends ViewGroup {public MyLayout (контекстный контекст) {супер (контекст);} @Override protected void onLayout (boolean changed, int l, int t, int r, int b);}}