Tsudzukeru
@Tsudzukeru

Почему получают доступ к контексту через MainActivity.this?

Здравствуйте. Неоднокрано видел, как обращаются к контексту через MainActivity.this
Я знаю что ключевое слово this применяется в java для вызова дополнительных конструкторов внутри других конструкторов и для указания полей, при совпадении имен параметров конструктора и полей класса.

Я читал, что есть еще одно использование ключевого слова this - это получение ссылки на внешний класс. Через Outer.this
или Outer.super (для получения ссылки на родитель внешнего класса). Я империческим путем попробовал сделать это. Получить ссылку на внешний класс и на класс потомок,чтобы понять на что прийдет мне ссылка, но у меня не получилось сослаться не на внешний класс ни на класс родитель с помощью ClassName.this.
Посмотрите на код
public class KeyWods {
    public static void main(String[] args) {
    C c = new C();
    C.D d = new C().new D();
    d.method();

    B b = new B();
    b.method();
    }
}

class A {
    @Override
    public String toString() {
        return "A";
    }
}

class B extends A{
    public void method(){
        System.out.println(B.this.toString());
    }

    @Override
    public String toString() {
        return "B";
    }
}

class C extends B{

    class D {
        public void method(){
            System.out.println(D.this.toString());
        }

        @Override
        public String toString() {
            return "D";
        }
    }

    @Override
    public String toString() {
        return "C";
    }
}


Вывод
D
B

Я не получил ссылку ни на внешний класс, не на класс родитель.

Так же я посмотрел полную иерархию наследования MainActivity. Получилось вот так:
MainActivity <- AppCompatActivity <-FragmentActivity <-ComponentActivity <- Activity <-ContextThemeWrapper <- ContextWrapper <- Context

Как так получается, что указывая MainActivity.this - мы получаем ссылку на контекст, минуя все эти классы? Это чисто фишка Андройда?
  • Вопрос задан
  • 193 просмотра
Решения вопроса 1
@terminator-light
В этом и заключается суть наслеования. Если класс B наследуется от A, то A - это родитель класса B, а B - потомок A. Пускай даже если C будет наследоваться от B, то он не перестанет быть потомком класса A, просто для класса B он будет прямым потомком.
Если какой-то метод требует объект класса Context, то можно будет передавать любые потомки класса Context. А MainActivity - потомок Context, поэтому он подойдет.
Я не получил ссылку ни на внешний класс, не на класс родитель.

class C extends B{

    class D {
        public void method(){
            System.out.println(C.this.toString()); // C.this - ссылка на внешний класс, т.е. на C
            System.out.println(super.toString()); // super или D.super - ссылка на родительский класс,
            // т.е. на Object, т.к. по умолчанию все классы наследуются от Object
        }

        @Override
        public String toString() {
            return "D";
        }
    }

    @Override
    public String toString() {
        return "C";
    }
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@402d
начинал с бейсика на УКНЦ в 1988
Контекст активити а андроид как проперти активити нужен для простого обращения из наследников классов обработчиков событий..

Вместо this мне нравится context.
В конструкторе присваивается ссылка на саму себя.

И в онкреате можно писать обработчики через анонимные классы.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы