Недавно был за собеседовании на стажера (java). Там было очень интересное собеседование в процессе которого выяснилось что некоторых знаний мне недодали а некоторые я просто не заучил. Буду благодарен за ресурсы где можно почитать об этом.
Вопрос первый , что бы яснее его понимать надо пересказать кусок диалога: "-Что такое наследование? -Наследование это механизм позволяющий переиспользовать методы описанные в одном классе в другом классе(да , не самое "научное" объяснение ну да едем дальше) -Хорошо , допустим есть класс в котором все методы паблик. ЗАЧЕМ нам от него наследоваться?"
В тот момент мой и без того нагруженный стрессом мозг не родил ничего умного но со временем я понял что можно было ответить про то что нам не придется создавать объект этого класса. И вообщем то все. Ничего умнее больше придумать я не смог. Вопрос первый закончен.
Следующий вопрос: "-Есть массив не отсортированных чисел. Найти комбинацию двух цифр дающих конкретную сумму. Как вы решите задачу? -Напишу вложенный цикл и переберу значения -Вложенный во что? -Цикл в цикле -Хорошо , но тогда у вас будут повторятся переборы. Т.е. в какой то момент у вас возникнет итерация цикла где выбрано второе и третье значения а в какой то где третье и второе. -Хм...Что бы этого не происходило я сделаю внутренний итератор равный внешнему +1 -И какая будет скорость этого алгоритма? -Ээээ..."
Заглянув в свои лекции я понял что ничего не знаю о том как измерять эти самые алгоритмы перебора значений(не путать с сортировкой и поиском просто конкретного значения) Т.е. задачу в принципе решил бы так:
int [] mas = new int{3,2,5,4,1,7,6};
int summa = myMethod(mas,5);
public int myMethod(int []mas,int sum){
int confirm = 0;
for(int i =0;i<mas.length;i++) {
for(int j = i+1;j<mas.length;j++){
confirm = mas[i]+mas[j];
if(confirm == sum){
return confirm;
}
}
}
return 0;
}
Но вот как замерить сумму алгоритма - хз. Где об этом можно почитать и есть ли более "изящные" решения?
И последний вопрос на который я не могу понять те ответы которые нахожу в гугле: Где надо использовать абстрактный класс а где интерфейс? С джавы 8 в интерфейсах можно писать реализованные методы и вот как бы момент в том что разница между абстрактным классом и интерфейсом стирается. Может кто сможет человеческим языком объяснить что лучше использовать?
-Хорошо , допустим есть класс в котором все методы паблик. ЗАЧЕМ нам от него наследоваться?"
Чтобы иметь возможность изменить/расширить состояние/поведение класса, в то же время не потеряв возможность использовать его в контекстах, в которых требуется объект базового класса.
-И какая будет скорость этого алгоритма?
O(N2)
Где надо использовать абстрактный класс а где интерфейс?
Интерфейс не может иметь состояние. Если вам не нужно определять поля - используйте интерфейс, в противном случае придётся использовать абстрактный класс.
Вопросов много и все очень обширные (не для Stackoverflow).
Хорошее понимание ООП и возможностей Java для новичков дадут пара книг издательства O'Reilly коллекции HeadFirst: "Изучаем Java" и "Паттерны проектирования".
По сложности алгоритмов - вот хорошая статья для новичков: https://habrahabr.ru/post/104219/
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Есть вот такие плееры, очень стали популярныТам перед просмотром нужно смотреть 15 секунд рекламу
Мне надо нарисовать с помощью кликов на форме многоугольник Я многоугольник нарисовалИ надо сделать над ним следующие действия: