Про наследование в андроид

Рейтинг: -1Ответов: 3Опубликовано: 28.09.2014

В общем, вопрос такой. Как известно, если класс Б наследуется от класса А, то классу Б будут доступны все методы из класса А, (кроме случая с private). В других языках везде так. А почему в Андроиде как-то по-другому понимается наследование. То есть если класс Б наследуется от класса А, а класс А запускается в начале программы, то если обратиться из класса А к классу Б, то класс Б сделает то же, что и класс А. То есть он тоже запустится и сделает все, что было написано в классе А. Ведь это неправильно. При наследовании только появляется возможность использовать методы из наследуемого класса. А тут получается, что Класс Б идентично выполняет всё, что написано в классе А.

В Классе А написан код, который выводит картинку, Класс Б, получается, тоже при запуске начинает выводить картинку.

Вот КОД http://ideone.com/10A8K8

Ответы

▲ 5Принят

Для начала, как уже было неоднократно отмечено, методы родительского класса A, будучи вызваны даже из производного класса B, ведут себя одинаково. Так что указываемое вами поведение правильно и имеет место в Java как под Android'ом, так и на всех других платформах. А также во всех других языках.

В комментариях прозвучал конструктивный вопрос: а что же делать? Как сделать так, чтобы метод setTXT не выполнялся в производном классе, а только в базовом?

Вот здесь возможны варианты. Самый простой концептуально — сделать метод setTXT не private, а protected, и переопределить (благо в Java методы по умолчанию виртуальные) этот метод в производном классе:

public class B extends A{
    @Override
    protected void setTXT() { }
}

Можно сделать и более просто, зато менее красиво: проверить точный тип класса в setTXT:

private void setTXT(){
    if (getClass() /* динамический тип */ != A.class /*статический тип*/) return;
    Toast.makeText(getApplicationContext(),"Привет",Toast.LENGTH_SHORT).show();
}
▲ 5

Допустим, есть два класса "A" и "B", "B" наследуется от "A", тогда созданный объект "b" будет так же являться и объектом "a", "b" будет обладать всеми методами "a".

  • Если у объекта "b" вызывается метод print(), который есть в классе "A", но которого нету в "B", то выполнится метод print() из класса "A".
  • Если у объекта "b" вызывается метод print(), которого нету в классе "A", но который есть в "B", то выполнится метод print() из класса "B".
  • Если у объекта "b" вызывается метод print(), который есть в классе "A" и в классе "B", то выполнится метод print() из класса "B". При этом в методе print() класса "B" можно вызвать print() из класса "A" (т.е. из суперкласса) через "super" (ссылка).

Всё это относится не к ОС, а к языку программирования, так что учите Java!

p.s. метод print() публичный, для понимания смысла модификаторов (и их отсутствия) лучше почитать книжку по java...

▲ 4

Модификаторы private, protected, public являются определителями области видимости, а не области выполнения. Вы, я так понял, воспринимаете их как ограничения области выполнения. Если бы это было так, то какую реакцию на создания класса B вы ожидаете? А если этих методов много? Сделали прямого наследника, и все вызовы приватных методов в предке обнулились, что ли?

А как быть, если мы класс B приведём к классу A?

P.S. Да, а что происходит в С++ в такой ситуации? Мне кажется, то же самое, но было бы интересно увидеть код, который подтверждает Вашу логику на C++.