Главная страница
Навигация по странице:

  • 1)Интерфейс описывает только поведение. У него нет состояния. А у абстрактного класса состояние есть: он описывает и то, и другое.

  • 3)

  • сколько угодно

  • EQUALS и HASH CODE

  • Чем отличается параметрический полиморфизм от ad-hoc Параметрический полиморфизм

  • У переопределенного метода должны быть те же аргументы, что и у метода родителя.

  • У переопределенного метода должен быть тот же тип возвращаемого значения, что и у метода родителя.

  • у примитива метод просто копирует значение в свою локальную переменную, изначальная переменная никак не меняется

  • Перегружать можно, переопределять нет

  • Для примитивных типов — вы передаете копию текущего значения, для ссылок на объекты — вы передаете копию ссылки (дистанционного управления)

  • Версия метода, который выполняется, НЕ будет определяться объектом, который используется для вызова

  • стэке

  • аннотация-маркер, которая может применяться только к методам

  • 9) Методы Object .

  • Java

  • класса Object

  • 3 модуль. 3 модуль Моё. Конструкторы Что такое конструктор


    Скачать 0.64 Mb.
    НазваниеКонструкторы Что такое конструктор
    Анкор3 модуль
    Дата02.12.2022
    Размер0.64 Mb.
    Формат файлаdocx
    Имя файла3 модуль Моё.docx
    ТипДокументы
    #825004


    Конструкторы:

    Что такое конструктор?

    Это метод для инициализации объекта во время его создания с помощью оператор new. Если его не описывать отдельно – у класса будет конструктор по умолчанию. От метода отличается тем, что у него нет возвращаемого типа и он называется так же, как и класс.

    Конструктор создает своеобразный “каркас” класса, которому каждый новый объект класса должен соответствовать.

    Может ли быть конструктор у абстрактного класса?

    Да, может. Конструктор будет вызван при создании объекта наследника.

    Например, если мы хотим выполнить некую инициализацию к полям абстрактного класса до того, как будет создан экземпляр класса наследника, инициализация неких final полей, которые не были заданы изначально, и мы хотим определить их в конструкторе.

    Если в абстрактном классе нет конструктора по умолчанию, то в классе наследнике необходимо определить заданный конструктор родителя.

    Конструктор абстрактного класса стоит делать protected.

    Будет ли в классе конструктор и какой, если при его создании ни один не был задан?

    Даже если вы его не написали, компилятор Java сам создаст конструктор по умолчанию (default constructor), который будет пустым и не делает ничего, кроме вызова конструктора суперкласса. super(); — выполнения конструктора без аргументов непосредственного класса-предка Конструктор похож на метод, но не является методом, он даже не считается членом класса.

    ?Зачем this в конструкторе абстрактного класса?
    Будет ли создан автоматически конструктор по-умолчанию, если в созданном классе есть любой другой конструктор?

    Конструктор по умолчанию (default constructor) – это конструктор, который не имеет параметров. Конструктор по умолчанию может объявляться в классе явным образом или генерироваться автоматически.

    Можно ли в классе вызвать один конструктор из другого? Как это сделать?

    Java позволяет осуществлять вызов конструкторов класса из другого конструктора этого же класса. Для этого используется ключевое слово this, которое есть ссылкой на текущий класс.
    Интерфейсы:

    Синтаксические отличия интерфейса от абстрактного класса (АК)? 5 отличий

    1)Интерфейс описывает только поведение. У него нет состояния. А у абстрактного класса состояние есть: он описывает и то, и другое.

    2)Абстрактный класс связывает между собой и объединяет классы, имеющие очень близкую связь. В то же время, один и тот же интерфейс могут реализовать классы, у которых вообще нет ничего общего.

    3) Классы могут реализовывать сколько угодно интерфейсов, но наследоваться можно только от одного класса.



    Можно ли создать поля в интерфейсе?

    Интерфейсы могут содержать поля, так же как и обычные классы, но с несколькими отличиями: Поля должны быть проинициализированы. Поля считаются публичными статическими финальными Модификаторы public, static и final не нужно указывать явно (они «проставляются» по умолчанию)

    Какие методы в интерфейсе могут иметь реализацию?

    Если класс реализует интерфейс, то он должен обязательно заполнить реализацию каждого (дефолтный метод при необходимости).
    Ранее до JDK 8 при реализации интерфейса мы должны были обязательно реализовать все его методы в классе. А сам интерфейс мог содержать только определения методов без конкретной реализации. В JDK 8 была добавлена такая функциональность как методы по умолчанию. И теперь интерфейсы кроме определения методов могут иметь их реализацию по умолчанию, которая используется, если класс, реализующий данный интерфейс, не реализует метод. Например, создадим метод по умолчанию в интерфейсе Printable.

    Такие методы должны быть определены ключевым словом default, они не требуют переопределения в классах и доступны всем объектам, реализующим данный интерфейс.
    Сколько максимум можно имплементировать интерфейсов ? =) сколько угодно

    В ограничениях JVM сказано 65535 интерфейсов может один класс реализовать.

    Что такое интерфейс? Когда использовать интерфейс? Чтобы решить проблему остутст множ насл классов

    Интерфейс это конструкция языка Java, в рамках которой принято описывать абстрактные публичные ( abstract public ) методы и статические константы ( final static ). С помощью интерфейса можно указать, что именно должен выполнять класс его реализующий, но не как это делать. Способ реализации выбирает сам класс
    Какие модификаторы доступа можно использовать в интерфейсе и абстрактом классе?

    Модификаторы доступа для абстрактных классов могут быть любыми. При этом, все методы, кроме абстрактных, должны иметь реализацию.

    По умолчанию все методы в интерфейсе фактически имеют модификатор public. А вот в случае с интерфейсами модификаторы доступа могут быть только двух типов, public и private (Они могут быть статическими и нестатическими, но они не могут иметь реализации по умолчанию.)
    Можно ли создавать статик методы в интерфейсах?зачем статик методы в интерфейсе

    В отличие от обычных статических методов, статические методы в интерфейсах не наследуются. Это означает, что если вы хотите вызвать такой метод, вы должны вызвать его напрямую из интерфейса, а не из реализующего его класса.

    Это поведение очень полезно для избежания проблем при множественном наследовании. Представьте, что у вас есть класс, реализующий два интерфейса. У каждого из интерфейсов есть статический метод с одинаковым именем и сигнатурой. Какой из них должен быть использован в первую очередь?

    ? Как написать валидный код, который скомпилируется, в котором вы имплементите интерфейс в класс и не реализуете в классе ни один из методов интерфейса, хотя все методы интерфейса абстрактные?
    Интерфейс – это класс без реализации. Имеет свой идентификактор interface. При имплементировании интерфейса классом, необходимо переопределить(@Override) все методы, которые определены в интерфейсе.

    Интерфейсы создают контракт определенный, контракт того, какие классы будут определены у имплементированных методов, и позволяет ослабить связанность классов. К примеру у нас есть клиент с тремя мессенджерами и он ими всеми пользуется. Но есть другой клиент который пользуется только одним. В таком случае, нам бы пришлось завести инстанс этого клиента с двумя null полями. Но вместо этого мы можем создать для клиента просто интерфейс, в котором описано, что «есть какой-то мессенджер, у него есть какая-то реализация, но мы не знаем какой это мессенджер.»

    Interface Messenger(){

    Void call();

    Void getMessage();

    Public class Client {

    Messenger messenger;

    }

    В примере предполагается что для классов мессенджеров уже создана имплементация классов из интерфейса Messenger.

    Абстрактный класс: – это общий набор свойств и поведений для группы объектов. Это класс, у которого не реализован один или больше методов (можно реализовать все методы, но тогда зачем называть класс абстрактным?). Абстрактный класс применяется, когда нужно семейство классов, у которых есть много общего. Конечно, можно применить и интерфейс, но тогда нужно будет писать много идентичного кода.

    Отличаются от обычных классов тем, что создать их объект нельзя. Несмотря на невозможность создавать объекты этого класса, всё равно можно задать начальные значения для общих полей, объявленных в этом абстрактном классе. В абстрактном классе могут быть объявлены и определены конструкторы. Если этого не сделать, то как и в обычном классе, автоматически будет создан конструктор без аргументов.

    Методы у них могут быть static(редко) и другие, не только абстрактные. Не могут быть public, protected и default. Может наследоваться и от интерфейсов, и от абстрактного класса. В случае с КОМПОЗИЦИЕЙ (двигатель автомобиля) будет достаточно унаследоваться от абстрактного класса.
    Может ли быть конструктор у абстрактного класса? Для чего?

    Да, может. Конструктор будет вызван при создании объекта наследника.

    Например, если мы хотим выполнить некую инициализацию к полям абстрактного класса до того, как будет создан экземпляр класса наследника, инициализация неких final полей, которые не были заданы изначально, и мы хотим определить их в конструкторе.

    Если в абстрактном классе нет конструктора по умолчанию, то в классе наследнике необходимо определить заданный конструктор родителя.

    cc

    Может ли быть абстрактный класс без абстрактных методов?

    Да, в абстрактном классе может не быть ни одного абстрактного метода. Сделать класс абстрактным в языке Java можно просто путем использования ключевого слова abstract при объявлении. Компилятор обеспечит выполнение всех структурных ограничений, например, запрета на создание экземпляров этого класса.

    Какие модификаторы доступа можно использовать в интерфейсе и абстрактом классе?

    Модификаторы доступа для абстрактных классов могут быть любыми. При этом, все методы, кроме абстрактных, должны иметь реализацию.

    По умолчанию все методы в интерфейсе фактически имеют модификатор public. А вот в случае с интерфейсами модификаторы доступа могут быть только двух типов, public и private (Они могут быть статическими и нестатическими, но они не могут иметь реализации по умолчанию.)

    ?Как сделать из обычного класса абстрактный класс не используя ключевое слово abstract?
    ENUM(Перечисление):- вид класса. У него есть ограниченный набор элементов, и все они доступны статически

    Перечислите методы именно класса Enum?

    name() - возвращает название констатны в Enum. похож на toString()

    ordinal()возвращает значение положения в ENUM объекте вызванного объекта Label.OK.ordinal

    valueOf() возвраает имя enum константы и ее значение.

    toString() - возвращает название константы.

    equals() - возвращает равенство объекта с объектом Enum

    hashCode() - считает хэшкод константы enum

    clone() - выкидывает ошибку CloneNotSupportedExc

    Нельзя клонировать константы в enum. Предназначен для предотвращения выполнения операции клонирования перечислений. Этот метод скрыт, поэтому вызвать его для перечисления не удастся

    compareTo() - возвращает -1, 0, 1 если обект меньше равен или больше.
    getDeclaringClass(). возвращает класс который обращается к константе enum

    У перечислений могут быть конструкторы.

    У перечислений могут быть поля

    У перечислений могут быть методы

    Если перечисление объявляется вне класса, оно может получить только два уровня доступа – public и по умолчанию.

    У перечислений есть статический метод values, который возвращает массив, содержащий все возможные значения, причем строго в том порядке, в котором они были заявлены

    Может ли Enum имплементировать (наследовать) интерфейсы?

    Да, Enum может наследовать интерфейсы. Поскольку Enum тип схож с классом и интерфейсом, он может наследовать интерфейс.

    Может ли Enum наследовать (extends) класс? Почему?

    Наследовать класс enum не может, так как уже наследуется от абстрактного класса java.lang.Enum, из-за чего имеет методы ordinal, values, valueOf . Поскольку Java не поддерживает множественное наследование классов.

    NATIVE:

    ключевое слово nati

    Ключевое слово native - машинно-зависимые методы

    Иногда требуется написать подпрограмму, написанную на языке, отличном от языка Java, для повышения скорости выполнения. В Java предусмотрено ключевое слово native, которое используется для объявления машинно-зависимых методов.

    Что такое нативные методы, их плюсы и минусы

    Методы с модификатором native, что говорит о том, что метод реализован на платформо-зависимом коде, на других языках (часто С, С++). Модификатор может быть применен только к методам.

    Плюсы – можно обратиться напрямую к операционной системе, взаимодействие между Java и средой за пределами Java, возможность использования библиотек других языков

    Минусы – просадка производительности, теряется статическая типовая информация, трудности при дебаггинге, могут быть ошибки в Java Native Interpritator которые не будут выброшены в JVM при неправильной настройке, можем потерять ключевую особенность джава – платформонезависимость.

    EQUALS и HASH CODE:

    контрактмежду equals hashcode

    Из-за чего происходят коллизии? Почему нельзя написать hashcode гарантировано без коллизий?

    Какой тип данных у hashcode? Может ли быть hashcode отрицательным?
    ООП:

    Что такое ООП? В чем его плюсы?

    Это методология программирования, основанная на представлении программы в виде совокупности объектов, каждый из которых является экземпляром определенного класса, а классы образуют иерархию наследования и иные взаимоотношения

    • При ООП можно повторно использовать объекты в других программах

    • ООП предотвращает ошибки, поскольку объекты скрывают информацию, к которой не должно быть доступа

    • ООП более эффективно организует структуру программ, в том числе больших

    • ООП упрощает обслуживание и модернизацию старого кода

    Удобное разделение задач по разработке между разными программистами, отделами, компаниями. Модульность за счёт инкапсуляции, возможно, стала решающей причиной такого широкого распространения ООП.

    Потенциал для масштабирования. Можно добавлять новые компоненты, расширяя уже написанное программное обеспечение — и всё будет работать.

    Обработка разнородных структур данных. Благодаря полиморфизму, софт на ООП можно гибко модифицировать, дополнять, «апдейтить». Это незаменимое свойство для коммерческих продуктов, а ведь именно они определяют доходы, бюджеты и создают ресурсную базу для новых и новых проектов.

    (Скорость) Повторяемость кода ООП привела к созданию библиотек классов. Можно тратить всё меньше времени на получение уже полученных ранее результатов — причём даже не очень важно, кем именно и на каких проектах были сделаны прежние разработки. Так и начал формироваться парадокс банана: с одной стороны — упрощение разработки за счёт тиражирования уже реализованных классов. С другой — неоптимальное использование аппаратных ресурсов.
    Что такое полиморфизм? Приведите пример полиморфизма?

    Это возможность применения одноименных методов с одинаковыми или разными параметрами в пределах одного класса или группы классов, связанных некоторым отношением (наследованием или реализацией одного или нескольких интерфейсов).

    Например, в переделах одного класса мы можем перегрузить метод, задав ему другие параметры.

    Можем переопределить метод родительского класса, задав ему другое поведение.
    Чем отличается параметрический полиморфизм от ad-hoc?

    Параметрический полиморфизм Это когда мы можем написать один код, с одним набором имен, которые работает с разными типами аргументов. Пример дженерики в Java. То есть "имена" методов одинаковые, потому что они в одном экземпляре. Реализация одна, одно поведение. А вот аргументы могут отличаться.

    Ключевое отличие от ad-hoc полиморфизма, в том, что наша реализация понятия не имеет что придет на вход. Может придти что угодно и с этим нужно будет работать, однако работать с любым типом мы будем абсолютно одинаково.

    Ad-hoc полиморфизм - при этом виде полиморфизма, у нас одинаковые имена, а поведение зависит от входящих аргументов. 
    Что такое Наследование, композиция, агрегирование

    Это выделение общих свойств и методов в родительский класс.

    Использование уже существующих классов для описания новых.

    Расширение уже имеющихся классов за счет добавления нового функционала.

    Расширение происходит за счет ключевого слова extends. Если в базовом классе определены конструкторы, то в конструкторе производного класса необходимо вызвать один из конструкторов базового с помощью ключевого слова super. При вызове конструктора после слова super в скобках идет перечисление передаваемых аргументов. Производный класс имеет доступ ко всем методам и полям базового класса (даже если базовый класс находится в другом пакете) кроме тех, которые определены с модификатором private. можно запретить наследование с помощью ключевого слова final.

    Отношения HAS A можно описать в коде, используя механизмы композиции и агрегирования. Разница между ними заключается в «строгости» этих связей.

    Композиция — более строгий тип связи. При использовании композиции объект не только является частью какого-то объекта, но и не может принадлежать другому объекту того же типа.

    Агрегация - Связь менее строгая Пример между классом Car и массивом пассажиров Passenger [] passengers

    Что такое инкапсуляция? Приведите пример инкапсуляции?

    Это сокрытие полей в классе и предоставление к ним доступа через публичные методы (сеттеры, геттеры)

    Инкапсуляция – это механизм “обёртывания” данных или кода, который работает с этими данными в отдельный модуль. Инкапсулированные, таким образом, переменные, отделены от других классов и доступ к ним возможен только с помощью методов класса, который содержит эти переменные.

    То есть внутренняя реализация скрывается от пользователя и доступ к ней предоставляется через открытый интерфейс, по средствам геттеров и сеттеров или модификаторов доступа.

    Важно правильно определить какие поля и методы будут открытыми, а какие скрытыми.

    Методы: это законченная последовательность действий (инструкций), направленных на решение отдельной задачи.

    Что можно делать при переопределении метода, а что нельзя?

    Можно изменить тип и/или количество параметров метода, реализацию.

    Изменение типа возвращаемого объекта к перегрузке не относится. (при указании одинаковых имен методов и одинаковых принимаемых параметров, но разного типа возвращаемого объекта – код не скомпилируется)
    Можно обеспечивать специфическую реализацию метода, уже реализованного в одном из суперклассов или родительских классов.

    У переопределенного метода должны быть те же аргументы, что и у метода родителя.

    Если метод voice родительского класса принимает на вход String, переопределенный метод в классе-потомке тоже должен принимать на вход String, иначе компилятор выдаст ошибку:

    У переопределенного метода должен быть тот же тип возвращаемого значения, что и у метода родителя.

    Модификатор доступа у переопределенного метода также не может отличаться от «оригинального»:

    Можно ли использовать статические методы в обычных? Наоборот? Почему?

    Статические методы можно использовать в обычных, обычные в статических нельзя

    Да Наоборот? -- нет

    Почему? -- для вызова обычного метода должен быть объект

    Переопределение метода.

    Переопределение метода – в классе наследнике выполнена альтернативная реализация метода родительского класса.

    При переопределении метода он должен иметь уровень доступа не меньше, чем уровень доступа в базовом класса.
    Ковариантность типа возвращаемого значения?

      Это то, что позволяет типу возвращаемого значения быть подтипом типа переопределенного метода .

    Что будет если передать массив в метод, который изменит его значения, изменятся ли они вне метода? Почему? А если передать примитив?

    В Java массивы и строки в методы передаются по копии ссылки на объект(массив). Примитивные типы данных вроде int, long, char и т.д. передаются в метод по копии значения. Если у отработавшего метода в параметрах был примитив, то копия значения удаляется и изменения оригинального примитива не происходят. А ВОТ У МАССИВА происходят, так как ты передаёшь в метод ссылку на массив (даёшь методу пульт управления, пощёлкал кнопки, а потом уничтожил пульт, но значения в массиве уже поменялись). Что бы этого не произошло, нужно сначала создать копию массива (не путать с копией ссылки на массив) а затем копию передать методу в качестве параметра. Сделать это можно так: int[] newArray = Arrays.copyOf(test, test.length);
    да.

    Почему? -- это ссылка.

    А если передать примитив?  --  Java передает все по значению!

    Если объект ссылочный, то копию ссылки.

    В джава в метод все передаётся по значению. Вне зависимости от того, что передаëшь, примитив или объект. Но у примитива метод просто копирует значение в свою локальную переменную, изначальная переменная никак не меняется.
    Указатели this и super.

    This с точной указывает на объект текущего класса. Часто его используют в инкапсуляции, чтобы не плодить названия переменных. Также используют в setter для проверки валидности ввода данных.

    Также this() можно использовать во вложенных конструкторах. Если мы хотим вызвать конструктор их конструктора( к примеру вызвать конструктор1 с двумя параметрами в конструкторе2, который вызывает три, из которых два одинаковы с конструктором1, можно использовать this(val1, val2). Не более одного вложения.

    Указатель super(val) позволяет обращаться к полям супер-класса.

    Если мы хотим расширить описательные свойства объекта путем наследования, но оставить от суперкласса все поля, их можно в конструкторе дочернего класса запихнуть в super.

    К примеру коробка – есть ШхВхД. У нее есть класс наследник, тяжелая коробка. Мы туда передадим ШхВхД из супер класса и добавим еще одно поле – вес.

    Public HeavyBox(int, w, h, d , weight )

    Super(w, h, d);

    This.weight = weight
    Могут ли нестатические методы перегрузить статические?

    Перегружать можно, переопределять нет. В случае со статическими методами это не переопределение (overriding), а сокрытие (hiding)

    Передача параметров в методы. По значению/по ссылке? Как передаются примитивы и объекты?

    По значению!!!! Для примитивных типов — вы передаете копию текущего значения, для ссылок на объекты — вы передаете копию ссылки (дистанционного управления). Вы никогда не передаете объект

    Что такое контракт метода? - какие условия использования у сущностей

    Public String someAction (int x, String y) throws Exception - сигнатура

    Public String someAction (intx, Stringy) throwsException – контракт - это сигнатура метода в сочетании с типом возвращаемого значения и бросаемыми исключениями
    Рефлексивность x.equals(x) == true

    Симметричность x.equals(y) == y.equals(x)

    Транзитивность x.equals(z), y.equals(z) => x.equals(y)

    Согласованность. Повторно вызванный метод вернет то же самое.

    Контракт.

    Если x.equals(y) == true => hashCode(x) == hashCode(y)

    Наоборот желательно чтобы работало, но так может не получиться.( коллизия hash кодов.)

    HashCode должен возвращать одно и то же значение при вызове на один и тот же объект.
    Что такое сокрытие методов - "method hiding"?

    версия скрытого метода, который вызывается, является таковой в суперклассе, а версия переопределенного метода, который вызывается, является таковой в подклассе.

    Метод скрытия означает, что подкласс определяет метод класса с той же сигнатурой, что и метод класса в суперклассе. В этом случае метод суперкласса скрыт подклассом. Это означает, что: Версия метода, который выполняется, НЕ будет определяться объектом, который используется для вызова. Фактически он будет определяться типом ссылочной переменной, используемой для вызова метода.

    Здесь Cat.foo() как говорят, скрывает Animal.foo(). Сокрытие не работает как переопределение, потому что статические методы не полиморфны. Так что произойдет следующее:
    STRING:

    Как реализована неизменность String?

    Все поля final, нет сеттеров, модификатор доступа private

    String – это public static final тип, который иммутабелен за счет этих модификаторов.

    ПАМЯТЬ:

    Обычно память делится на две большие части: стек и куча. Имейте в виду, что размер типов памяти на этом рисунке не пропорционален реальному размеру памяти. Куча - это огромный объем памяти по сравнению со стеком.

    Стек (Stack)

    Стековая память отвечает за хранение ссылок на объекты кучи и за хранение типов значений (также известных в Java как примитивные типы), которые содержат само значение, а не ссылку на объект из кучи.

    Кроме того, переменные в стеке имеют определенную видимость, также называемую областью видимости. Используются только объекты из активной области. Например, предполагая, что у нас нет никаких глобальных переменных (полей) области видимости, а только локальные переменные, если компилятор выполняет тело метода, он может получить доступ только к объектам из стека, которые находятся внутри тела метода. Он не может получить доступ к другим локальным переменным, так как они не выходят в область видимости. Когда метод завершается и возвращается, верхняя часть стека выталкивается, и активная область видимости изменяется.

    Возможно, вы заметили, что на картинке выше отображено несколько стеков памяти. Это связано с тем, что стековая память в Java выделяется для каждого потока. Следовательно, каждый раз, когда поток создается и запускается, он имеет свою собственную стековую память и не может получить доступ к стековой памяти другого потока.

    Куча (Heap)

    Эта часть памяти хранит в памяти фактические объекты, на которые ссылаются переменные из стека. Например, давайте проанализируем, что происходит в следующей строке кода:

    StringBuilder builder = new StringBuilder();

    Ключевое слово new несет ответственность за обеспечение того, достаточно ли свободного места на куче, создавая объект типа StringBuilder в памяти и обращаясь к нему через «Builder» ссылки, которая попадает в стек.

    Для каждого запущенного процесса JVM существует только одна область памяти в куче. Следовательно, это общая часть памяти независимо от того, сколько потоков выполняется. На самом деле структура кучи немного отличается от того, что показано на картинке выше. Сама куча разделена на несколько частей, что облегчает процесс сборки мусора.

    Максимальные размеры стека и кучи не определены заранее - это зависит от работающей JVM машины. Позже в этой статье мы рассмотрим некоторые конфигурации JVM, которые позволят нам явно указать их размер для запускаемого приложения.
    В какой области памяти хранятся примитивы?в стеке

    В какой области памяти хранятся объекты?

    В Java примитивы и ссылки на объекты хранятся в стэке, а объекты в куче.

    Где хранятся ссылки на объект?
    Данные:
    Как реализовать свой Immutable тип данных?

    1. Запретите расширение класса – либо объявите его final, либо закройте доступ наследникам ко всем способам мутации, перечисленным в следующих пунктах;
    2. Сделайте все поля финальными;
    3. Не выставляйте наружу методов-мутаторов, которые меняют состояние;
    4. Не отдавайте наружу поля ссылочного изменяемого типа (объекты классов, массивы) – если объект под ссылкой не иммутабельный, должна возвращаться его глубокая копия (defensive copy);

    5. Создавайте объект правильно

    Что такое позднее(динамическое) и раннее(статическое) связывание?

    статическое связывание носит более статический характер, так как происходит во время компиляции, то есть код «знает», какой метод вызывать после компиляции исходного кода на Java в файлы классов. А поскольку это относится к ранней стадии жизненного цикла программы, то называется также ранним связыванием (early binding). С другой стороны, динамическое связывание происходит во время выполнения, после запуска программы виртуальной машиной Java. В этом случае то, какой метод вызвать, определяется конкретным объектом, так что в момент компиляции информация недоступна, ведь объекты создаются во время выполнения. А поскольку это происходит на поздней стадии жизненного цикла программы, то называется в языке Java поздним связыванием (late binding).

    Итак, фундаментальное различие между статическим и динамическим связыванием в Java состоит в том, что первое происходит рано, во время компиляции на основе типа ссылочной переменной, а второе – позднее, во время выполнения, с использованием конкретных объектов.

    Что такое varargs?

    это аргументы переменной длины: фича, которая появилась еще в JDK5. Varargs позволяют нам создавать методы с произвольным количеством аргументов. По большому счету, создавать такие методы можно было и раньше. Правда, делать это было не очень удобно.

    Какие есть ограничения при написании?

    Правило 1. Vararg аргумент (или же аргумент переменной/произвольной длины) обозначается через троеточие следующим образом:

    Правило 2. Аргумент произвольной длины может быть указан только как аргумент некоторого метода:

    Правило 3. Каждый такой аргумент переменной длины в теле метода является массивом:

    Правило 4. Vararg аргумент должен быть последним в списке аргументов метода:

    Правило 5. Несмотря на то, что varargs являются массивами, при вызове метода, который принимает аргументы переменной длины, не обязательно создавать массив. Достаточно и даже желательно просто перечислить необходимые аргументы через запятую:

    Для чего нужна аннотация Overide

    @Override — аннотация-маркер, которая может применяться только к методам. Метод, аннотированный как @Override, должен переопределять метод супер класса. @Override — проверяет, переопределён ли метод.

    Перечислите все модификаторы доступа в порядке уменьшения закрытости, какую область видимости они имеют?

    Public – видимость в пределах проекта

    Default – видимость в пределах пакета

    Private – видимость в пределах класса

    Protected – доступ в пределах пакета и классов наследников
    В чем разница между передачей параметров по ссылке или по значению ?
    Модификатор static

    Модификатор, применяемы к полю, блоку, методу или внутреннему классу. Данный модификатор указывает на привязку субъекта в текущему классу.

    Вы НЕ можете переопределять статические методы. Если объявить такой же метод в классе наследнике, с таким же именем и сигнатурой, то мы лишь «спрячем» метод суперкласса вместо переопределения. Это называется сокрытием методов. В отличие от переопределения, такие методы не будут выполнены (разрешены) во время работы программы, то есть переменная будет проинициализирована на этапе компилирования (будет применено статическое (ранее) связывание).
    Что такое final? Что может быть final? Как они работают?

    Это модификатор

    Оно может применяться к классам, методам, переменным (в том числе аргументам методов).

    Для класса это означает, что класс не сможет иметь подклассов, т.е. запрещено наследование.

    Для переменных примитивного типа это означает, что однажды присвоенное значение не может быть изменено.

    Для ссылочных переменных это означает, что после присвоения объекта, нельзя изменить ссылку на данный объект. Это важно! Ссылку изменить нельзя, но состояние объекта изменять можно.

    Чтобы запретить переопределение метода в классах наследниках, в начале его объявления следует указать ключевое слово final. Такие методы еще называют завершенными.

    В чём разница между instanceOf и getClass?

    Давайте разберемся, что делает каждый подход:

    instanceof проверяет, является ли ссылка на объект с левой стороны экземпляром типа с правой стороны или некоторым его подтипом.

    getClass() == ... проверяет идентичность типов.

    То есть, если getClass() проверяет полную идентичность класса, то instanceof вернет true даже если объект будет всего лишь подтипом, что может дать нам большую гибкость при активном использовании полиморфизма. Собственно, оба подхода хороши, если понимать особенности их работы и применять в нужных местах.
    Классы:

    Класс Object, все методы кроме wait, notify, notifyAll, назвать и объяснить, как работают

    Все классы наследуются от класса Object.

    Следовательно у всех классов есть методы, наследуемые от класса Object.

    Ссылочная переменная класса Object может ссылаться на любой объект другого класса.

    Массивы являются тоже классами, поэтому переменная Object может ссылаться и на массивы.

    Создадим ссылку на объекта класса Cat

    Object obj = new Cat("qwe");

    Чтобы выполнять операции над этим классом, выполним приведение типов

    Cat cat = (Cat) obj;
    Теперь можем применять различные методы от класса Object.

    cat.ToString() выведет представление класса в виде строки Cat@4971195b. это хэшкод класса в хексе

    этот метод часто переопределяют
    hashCode()

    Возвращает интовое значение хэш кода.
    getClass()

    Возвращает тип класса.
    equals()

    Сравнивает два объекта на равенство.

    Часто переопределяют.
    clone()

    создает и возвращает копию объекта с новой ссылкой
    void finalize()

    вызывается перед удалением неиспользуемого объекта.
    notify()

    Возобновляет выполнение потока который ожидает вызываюший объект.
    notifyAll()

    Возобновление всех потоков.
    wait() - ожидает другого потока выполнения.

    wait(long millis)

    wait (long millis, int nanos)
    Какие модификаторы доступа бывают у классов ?

    Public – видимость в пределах проекта

    Default – видимость в пределах пакета

    Private – видимость в пределах класса

    Protected – доступ в пределах пакета и классов наследников
    Класс Object и класс Class.

    9) Методы Object.

    getClass – возвращает описание класса, к которому принадлежит экземпляр.

    clone, toString, equals, hashcode, notify, notifyAll, wait.

    9) Объект Class

    Для всех классов во время компиляции создается класс Class.

    Получить экземпляр типа Class, можно вызвав метод getClass, либо обратившись к классу через имя – ИмяКласса.class. Описание класса содержит в себе всю информацию о классе – его имя набор переменных и методов, внутренних классов и т.д.
    В Java есть специальный суперкласс Object и все классы являются его подклассами. Поэтому ссылочная переменная класса Object может ссылаться на объект любого другого класса. Так как массивы являются тоже классами, то переменная класса Object может ссылаться и на любой массив
    В Java почти все сущности являются объектами, за исключением примитивных типов. У каждого объекта есть класс. Сами классы тоже является объектами, и они принадлежат классу Class.

    У класса Class нет публичных конструкторов. Class - это generic тип. Методы Class предназначены для получения информации о классе (объекте типа Class). Например, можно узнать полное имя класса, какие у него аннотации, какие конструкторы и т.п. Эти методы нужны для reflection. С помощью reflection вы можете создавать объекты, которые принадлежат этому классу, и при этом заранее класс объекта вы можете не знать.

    1)Зачем this в конструкторе абстрактного класса?

    2)Как написать валидный код, который скомпилируется, в котором вы имплементите интерфейс в класс и не реализуете в классе ни один из методов интерфейса, хотя все методы интерфейса абстрактные?

    3)Как сделать из обычного класса абстрактный класс не используя ключевое слово abstract?

    2. Имплементировать интерфейс в абстрактном классе

    3. Сделать внутри класса абстрактный метод

    На первый не помню, сам где то в интернете нашел. Что-то про то что обращаешься к своему классу(не уверен)


    написать администратору сайта