Подскажите пожалуйста, в конструкторе класса GenerateThread и методе toString() возможно три варианта записи (с ключевыми словами this и super, и без них, и все работают):
Конструктор: toString():
start(); getName();
this.start(); this.getName();
super.start(); super.getName();
Кто знает, почему так, в чем разница, и какую тему я пропустил/не понимаю???
mr.xopkins
18 уровень
Подскажите пожалуйста, в чем разница и где искать ответ
Решен
Комментарии (6)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
--------Master
14 августа 2018, 14:14решение
start(); и this.start(); - фактически одно и то же, вызов метода у текущего объекта. super.start(); - вызов метода родительского класса, в данном случае - класса Thread (т.е. запуск нити)
+3
mr.xopkins
15 августа 2018, 22:28
Ок, про this.start() и просто start() более-менее понятно, можно представить, что ключевое слово this неявно присутствует, даже если мы его руками явно не прописываем при вызове метода, но каким образом наш отдельный экземпляр класса-наследнияка Thread запускается при помощи вызова метода родителя, кода у нас присутствует абсолютно такой же унаследованный метод??? То есть получается родительский класс, при вызове его метода start(), ведет себя следующим образом: "Ага, кажется объект моего класса-наследника вызвал мой метод!? Тогда сделаю так, что бы этот метод вызвался у него самого-же, ведь у него есть такой-же метод!..." ?
Если можешь, объясни пожалуйста, может что то упустил по ходу курса?
0
Илья ГековMaster
15 августа 2018, 22:38
Мне кажется вы путаете методы run() и start(), start для запуска нити не переопределяют в своем классе, переопределяют метод run(), в котором и указывают всю функциональность нити, а запускают нить через start(). Соответственно вызов this.start() и super.start() - это вызов одного и того же метода (если конечно по какой то причине вы не решили переопределить у себя метод start(), хотя я не могу представить зачем).
+1
Илья ГековMaster
15 августа 2018, 22:44
Вот для наглядности два одинакового по функциональности кода:
Оба раза нить отработает одинаково, только в первом случае new MyThread().start() вызовет напрямую метод своего родителя (Thread), а во втором случае сначала свой метод start, который через ключевое слово super вызовет метод start у родителя. +1
Илья ГековMaster
15 августа 2018, 22:46
Но! Если убрать из своего переопределенного метода start() вызов родительского метода start(), то все поломается и нить не заработает:
Потому что только метод start() класса Thread может запустить нить и никто другой, потому и нет никакого смысла в его переопределении. +3
mr.xopkins
16 августа 2018, 13:18
Спасибо большое
0