_Конспект CORE-1. Core1 1ооп Что такое ооп
Скачать 73.05 Kb.
|
14.Что делает метод intern() в классе String? Этот метод всегда возвращает строку, которая имеет то же значение, что что и текущая строка, но гарантирует что это будет строка из пула уникальных строк. Если пул строк уже содержит строку, эквивалентную к нашему объекту, что подтверждается методом equals(Object), тогда возвращается ссылка на строку из пула. В противном случае объект строки добавляется в пул и ссылка на этот объект возвращается. 15.Можно ли использовать строки в конструкции switch? Java7 расширяет возможности оператора switch для использования строк, ранние версии Java не поддерживают этого. Если мы реализуем условный поток для строк, можно использовать условия if-else. Можно использовать оператор switch, если используете Java7 или поздние версии. 16.Какая основная разница между String, StringBuffer, StringBuilder? String – неизменяемая строка. StringBuffer — потокобезопасная изменяемая строка. StringBuilder – изменяемая строка с высокой производительностью, но без синхронизации. 17.Существуют ли в java многомерные массивы? Java не поддерживает многомерные массивы, но позволяет создавать и использовать массивы любого количества измерений. Массивы в массивах. Двумерный массив не что иное, как массив из одномерных массивов, из-за этого, можно создать двумерный, где отдельные одномерные имеет разную длину. 18.Какими значениями инициируются переменные по умолчанию? Переменные, которые являются полями, если для них не указано значение, то они инициализируются значением по умолчанию. Числа инициализируются 0 или 0.0. Объекты (в том числе String) – null, char – \u0000; boolean – false. 19.Что такое сигнатура метода? Весь код, который описывает метод, называется объявлением метода. Сигнатура метода включает название метода и типы параметров в определенном порядке. Имя плюс типы параметров (упорядоченные). Сигнатура однозначно идентифицирует метод. Возвращаемое значение не входит в сигнатуру, а порядок следования параметров – входит. 20.Расскажите про метод main Метод main() отличается от всех остальных методов тем, что является, как правило, точкой входа в программу. Этот метод вызывается виртуальной машиной Java. Как только заканчивается выполнение метода main(), так сразу же завершается, тем самым, работа самой программы. Их может быть несколько точек входа, тогда в конфигураторе необходимо выбрать нужный. Можно передавать параметры в program arguments. 21.Каким образом переменные передаются в методы, по значению или по ссылке? В Java параметры в методы передаются по значению, т.е создаются копии параметров для метода. В случае с примитивными – сама переменная не будет менятся, т.к в метод она копируется. А при передаче объекта в метод копируется ссылка. Если в методе изменяется состояние объекта – за методом тоже меняется. При присвоении новой ссылки – старая не изменится. Объекты – по ссылке. Примитивы – по значению. [4*ООП в Java] 1.Какие виды классов есть в java? Класс – логическое описание, шаблон. В Java есть 4 вида классов внутри другого класса: - Вложенные внутренние классы – нестатические классы внутри внешнего класса. - Вложенные статические классы – статические классы внутри внешнего класса. - Локальные классы Java – классы внутри методов. - Анонимные Java классы – классы, которые создаются на ходу. 2.Расскажите про вложенные классы. В каких случаях они применяются? Вложенные классы - по сути, это более подробное описание каких-то деталей нашего внешнего класса. Особенности нестатических вложенных классов Java: - Они существуют только у объектов, потому для их создания нужен объект. - Внутри Java класса не может быть статических переменных. Если вам нужны какие-то константы или что-либо еще статическое, выносить их нужно во внешний класс. Это связано с тесной связью нестатического вложенного класса с внешним классом. - У класса полный доступ ко всем приватным полям внешнего класса. Данная особенность работает в две стороны. - Можно получить ссылку на экземпляр внешнего класса. Статические классы внутри внешнего класса: Данный вид классов не отличается ничем от обычного внешнего класса, кроме одного: для создания экземпляра такого класса, нужно через точку перечислить весь путь от внешнего класса до нужного. Статические классы используются для того, чтобы укомплектовать связанные классы рядом, чтобы с логической структурой было работать проще. Количество классов уменьшилось. Все классы внутри их класса-родителя. 3.Что такое «локальный класс»? Каковы его особенности? Данные классы объявляются внутри других методов. По сути, они обладают всеми свойствами нестатического вложенного класса, только создавать их экземпляры можно только в методе, при чем метод не может быть статическим (для их создания нужен экземпляр внешнего класса, в нестатические методы неявно передается ссылка на экземпляр вызывающего объекта, а в статическом методе данной ссылки нет). - Локальные классы способны работать только с final переменными метода. Все дело в том, что экземпляры локальных классов способны сохраняться в «куче» после завершения работы метода, а переменная может быть стёрта. Если же переменная объявлена final, то компилятор может сохранить копию переменной для дальнейшего использования объектом. И еще: с 8+ версий Java можно использовать не final переменные в локальных классах, но только при условии, что они не будут изменяться. - Локальные классы нельзя объявлять с модификаторами доступа. - Локальные классы обладают доступом к переменным метода. Локальные классы можно встретить крайне редко, так как они затрудняют прочтение кода и не обладают никакими плюсами, кроме одного – доступ к переменным метода. 4.Что такое «анонимные классы»? Где они применяются? Анонимные классы – просто обычные нестатические вложенные классы. Их особенность в удобстве их использования. Можно написать свой класс прямо при создании экземпляра другого класса. Мы просто совмещаем в одном месте две вещи: создание экземпляра одного класса и создание экземпляра его внутреннего-класса наследника. Иначе нам нужно создавать класс отдельно и использовать более длинные конструкции, чтобы добиться того же самого результата. Использование анонимных классов оправдано во многих случаях, в частности когда: - тело класса является очень коротким; - нужен только один экземпляр класса; - класс используется в месте его создания или сразу после него; - имя класса не важно и не облегчает понимание кода. Часто анонимные классы используются в графических интерфейсах для создания обработчиков событий. Например для создания кнопки и реакции на её нажатие. 5.Каким образом из вложенного класса получить доступ к полю внешнего класса? РодительскийКласс.this.Поле Внутренний класс в локальном методе не может использовать локальные переменные внешнего метода до тех пор, пока локальная переменная не будет объявлена как финальная (final). 6.Что такое перечисления (enum)? При задаче необходимости ограничения множества допустимых значений для некоторого типа данных в Java предусмотрен специальный тип данных – перечисление (enum) Перечисление — это класс. Объявляя enum мы неявно создаем класс производный от java.lang.Enum Элементы перечисления — экземпляры enum-класса, доступные статически Их статическая доступность позволяет нам выполнять сравнение с помощью оператора сравнения ссылок (==) 7.Как проблема ромбовидного наследования решена в java? в Java запрещено множественное наследование от классов. Java не поддерживает множественное наследование классов потому, что это может привести к ромбовидной проблеме. В Java множественное наследование не поддерживается в классах, но оно поддерживается в интерфейсах. И один интерфейс может расширять множество других интерфейсов. Интерфейсы только объявляют методы, а реализация будет выполнена в классах, наследующих интерфейс. 8.Что такое конструктор по умолчанию? Конструктор по умолчанию – это конструктор класса, который объявляется без параметров. Если класс не содержит явным образом определенный конструктор, тогда при создании объекта автоматически вызывается конструктор по умолчанию. Этот конструктор пустой и не делает ничего, кроме вызова конструктора суперкласса. Если в классе определен конструктор с параметрами, а перегруженного конструктора без параметров нет, то вызов конструктора без параметров является ошибкой. 9.Могут ли быть приватные конструкторы? Для чего они нужны? Можно сделать конструктор приватным, чтобы не дать внешнему коду создать новый экземпляр класса. В шаблоне проектирования, называемом Singleton, приватный конструктор используется, чтобы гарантировать, что всегда существует только один экземпляр класса. Класс Singleton предоставляет статический метод для получения этого уникального экземпляра. Другое - это делегирование конструкторов; у вас может быть один конструктор, который принимает множество различных параметров, которые действительно являются деталями реализации, поэтому вы делаете их закрытыми. Но затем ваши остальные конструкторы делегируют ему. 10.Расскажите про классы-загрузчики и про динамическую загрузку классов. Любой класс (экземпляр класса java.lang.Class в среде и .class файл в файловой системе), используемый в среде исполнения был так или иначе загружен каким-либо загрузчиком в Java. Для того, чтобы получить загрузчик, которым был загружен класс А, необходимо воспользоваться методом A.class.getClassLoader(). Классы загружаются по мере надобности, за небольшим исключением. Некоторые базовые классы (java.lang.* в частности) загружаются при старте приложения. Классы расширений ($JAVA_HOME/lib/ext), пользовательские и большинство системных классов загружаются по мере их использования. Различают 3-и вида загрузчиков в Java. Это — базовый загрузчик (bootstrap), системный загрузчик (System Classloader), загрузчик расширений (Extension Classloader). - Bootstrap — реализован на уровне JVM и не имеет обратной связи со средой исполнения. Данным загрузчиком загружаются классы из директории $JAVA_HOME/lib. Т.е. всеми любимый rt.jar загружается именно базовым загрузчиком. - System Classloader — системный загрузчик, реализованный уже на уровне JRE. Этим загрузчиком загружаются классы, пути к которым указаны в переменной окружения CLASSPATH. - Extension Classloader — загрузчик расширений. Данный загрузчик загружает классы из директории $JAVA_HOME/lib/ext. Различают текущий загрузчик (Current Classloader) и загрузчик контекста (Context Classloader). - Current Classloader — это загрузчик класса, код которого в данный момент исполняется. Текущий загрузчик используется по умолчанию для загрузки классов в процессе исполнения. При любой декларации класса, ранее не загруженного. - Context Classloader — загрузчик контекста текущего потока. Загрузчик контекста устанавливается автоматически для каждого нового потока. При этом, используется загрузчик родительского потока. Загрузчики классов образуют иерархию. Корневым является базовый (у него предка нет). Все остальные загрузчики при инициализации инстанциируют ссылку на родительский загрузчик. Такая иерархия необходима для модели делегирования загрузки. 11.Чем отличаются конструкторы по-умолчанию, конструктор копирования и конструктор с параметрами? Конструктор по умолчанию не принимает никаких параметров. Конструктор копирования принимает в качестве параметра объект класса. Конструктор с параметрами принимает на вход параметры (обычно необходимые для инициализации полей класса). 12.Какие модификаторы доступа есть в Java? Какие применимы к классам? - private (закрытый) – доступ к члену класса не предоставляется никому, кроме методов этого класса. Другие классы того же пакета также не могут обращаться к private-членам. - default - доступ по умолчанию, когда никакой модификатор не присутствует – член класса считается открытым внутри своего собственного пакета, но не доступен для кода, расположенного вне этого пакета. - protected (защищённый) – доступ в пределах пакета и классов наследников. Доступ в классе из другого пакета будет к методам public и protected главного класса. - public (открытый) – доступ для всех из любого другого кода проекта Модификаторы в списке расположены по возрастающей видимости в программе. 13.Что означает модификатор static? Модификатор static в Java напрямую связан с классом. Если поле статично, значит оно принадлежит классу, если метод статичный — аналогично: он принадлежит классу. Исходя из этого, можно обращаться к статическому методу или полю, используя имя класса. 14.Может ли статический метод быть переопределён или перегружен? НЕ можете переопределять (Override) статические методы. Если вы объявите такой же метод в классе-наследнике (subclass), т.е. метод с таким же именем и сигнатурой, вы лишь «спрячете» метод суперкласса (superclass) вместо переопределения. Это явление известно как сокрытие методов (hiding methods). Это означает, что при обращении к статическому методу, который объявлен как в родительском, так и в дочернем классе, во время компиляции всегда будет вызван метод исходя из типа переменной. В отличие от переопределения, такие методы не будут выполнены во время работы программы. 15.Могут ли нестатические методы перегрузить статические? Мы не можем перегрузить два метода в Java, если они отличаются только статическим ключевым словом (количество параметров и типы параметров одинаковы). У нас может быть два или более статических метода с одинаковыми именами, но с различиями во входных параметрах. 16.Можно ли сузить уровень доступа/тип возвращаемого значения при переопределении метода? Изменить можно, но при условии его расширения (package private -> protected -> public) Нет смысла делать функцию в наследнике менее открытой, потому что она всё равно может быть вызвана через базовый класс. Принцип подстановки Лисков. Там, где допустимо использовать тип Х, должно быть допустимо использовать и любой тип, наследующийся от него. 17.Что можно изменить в сигнатуре метода при переопределении? Можно ли менять модификаторы (throws и тп)? (override) В новом методе должны быть те же сигнатура и тип возвращаемого результата, что и у метода родительского класса. Сигнатура метода включает название метода и типы параметров в определенном порядке. Имя плюс типы параметров (упорядоченные). Возвращаемое значение не входит в сигнатуру, а порядок следования параметров – входит. Переопределяться могут только наследованные методы, т.е. полиморфизм применим только к переопределению. 18.Могут ли классы быть статическими? Статическим классом в java может быть только вложенный класс - есть вложенные(static) и внутрение классы. static имеет доступ только к статичным полям. Но можно имитировать статический класс (через final private static). 19.Что означает модификатор final? К чему он может быть применим? Ключевое слово. Оно может применяться к классам, методам, переменным (в том числе аргументам методов). Для класса это означает, что класс не сможет иметь подклассов, т.е. запрещено наследование. Это полезно при создании immutable (неизменяемых) объектов, например, класс String объявлен, как final. К абстрактным классам (с ключевым словом abstract), нельзя применить модификатор final, т.к. это взаимоисключающие понятия. Для метода final означает, что он не может быть переопределен в подклассах. Это полезно, когда мы хотим, чтобы исходную реализацию нельзя было переопределить. Для переменных примитивного типа это означает, что однажды присвоенное значение не может быть изменено. Для ссылочных переменных это означает, что после присвоения объекта, нельзя изменить ссылку на данный объект. Это важно! Ссылку изменить нельзя, но состояние объекта изменять можно. 20.Что такое абстрактные классы? Чем они отличаются от обычных? Абстрактный класс — это класс, в объявлении которого есть ключевое слово abstract. Его отличие от обычного класса в том, что нельзя создать объект или экземпляр данного класса (Но, можно создать переменную этого класса). Это чертеж-заготовка. Все остальное в абстрактном классе остается таким как и в обычном. У него есть методы. Только абстрактный класс может иметь абстрактные методы — у которых нет реализации, только объявление. Это означает, что абстрактный метод должен быть реализован в классе-наследнике. Для того чтобы полностью понимать картину абстрактный классов и методов нужно владеть таким понятием как ООП. Ведь абстрактные классы чаще всего используются при реализации наследования. Абстрактный класс может содержать как обычные, так и абстрактные методы. 21.Может ли быть абстрактный класс без абстрактных методов? Да, может. Абстрактный класс может содержать как обычные, так и абстрактные методы. Может ли обычный класс иметь абстрактный метод? Ответ: не может. Абстрактный класс может иметь абстрактный и обычный метод, но обычный класс не может иметь абстрактный метод. 22.Могут ли быть конструкторы у абстрактных классов? Для чего они нужны? Да, в абстрактном классе в Java можно объявить и определить конструкторы. Поскольку создавать экземпляры абстрактных классов нельзя, вызвать такой конструктор можно только при формировании цепочки конструкторов, то есть при создании экземпляра конкретного класса-реализации. Конструктор можно использовать для задания начальных значений общих переменных, объявленных в абстрактном классе и используемых различными реализациями. Даже если вы не объявили никакого конструктора, компилятор добавит в абстрактный класс конструктор по умолчанию без аргументов. Абстрактные классы могут реализовывать интерфейсы с помощью ключевого слова implements. Поскольку они абстрактные, то не обязаны реализовывать все методы. |