JAVA CORE Flashcards
Что такое класс Object?
Базовый клаасс джава от которого наследуются остальные классы в языке.
Какие в классe Object есть методы?
hashcode()
equals()
clone()
toString()
getClass()
finalize()
notify()
notifyAll()
wait()
Что такое метод equals(). Чем он отличается от операции ==.
equals по умолчанию сравниваются ссылки, а не
поля.
Если вы хотите переопределить equals(), какие условия должны удовлетворяться для переопределенного метода?
Объект должен равняться себе самому.
Всегда должен быть равным такому же обьекту в обе стороны.
У них должен быть одинаковый хешкод
@Override public boolean equals(Object obj) { if (obj == this) { return true; } if (obj == null || obj.getClass() != this.getClass()) { return false; }
Если equals() переопределен, есть ли какие-либо другие методы, которые следует переопределить?
по умолчанию хешкод -адрес ячейки памяти смещенное на три…в старых версиях java, который сохр в переменную(т.е сслучайное число)…сейчас
Последовательность случайных чисел, генерируемая упомянутым алгоритмом, зависит от некоторого начального значения - если его не менять, то и числа будут одни и те же.
модификаторы доступа в Java
private - only class default - package protected - package & subclasses public - all
Если у класса-родителя есть метод, объявленный как private, может ли наследник расширить его видимость? А если protected? А сузить видимость?
модификатор доступа переопределенных методов дочерних классов может идти только в сторону расширения области видимости package->protected->public…а приватную переменную подкласс не увидит
Что означает ключевое слово final?
Для переменной - это станет константой
для метода - его нельзя переопределить
для класса - ему нельзя создать наследников
Имеет ли смысл объявлять метод private final?
метод final уже является private
Какие особенности инициализации final переменных?
- Если она static, то инициализация при первом обращении к этой переменной, либо при первом создании объекта такого класса.
- Если не static то инициализируются в конструкторе
Что будет, если единственный конструктор класса объявлен как final
Ошибочка компиляции
К каким конструкциям Java применим модификатор static
К методу.
К внутреннему классу.
К полю.
К импортируемым классам
Модификатор static и какие ограничения накладываются на методы?
Модификатор static говорит о том, что метод или поле класса принадлежат не объекту, а классу. Т.е. доступ можно будет получить и не создавая объекта класса
На методы, объявленные как static, накладывается ряд ограничений.
Они могут вызывать только другие статические методы.
Они должны осуществлять доступ только к статическим переменным.
Они не могут ссылаться на члены типа this или super.
Что будет, если в static блоке кода возникнет исключительная ситуация?
Если в явном виде написать любое исключение в static-блоке, то компилятор не скомпилирует исходники. Это все от того, что компилятор умный. В остальном, взаимодействие с исключениями такое же как и в любом другом месте.
Можно ли перегрузить static метод?
Перегрузить можно, но переопределить нельзя
Что такое статический класс, какие особенности его использования?
Это вложенный класс, который может обращаться только к статическим полям обертывающего его класса, в том числе и приватным. Доступ к нестатическим полям обрамляющего класса может быть осуществлен только через ссылку на экземпляр обрамляющего объекта. К классу высшего уровня модификатор static неприменим. public class Test { class A { } static class B { }
public static void main(String[] args) { /*will fail - compilation error, you need an instance of Test to instantiate A*/ A a = new A(); /*will compile successfully, no instance of Test is needed to instantiate B */ B b = new B(); }
}
Какие особенности инициализации final static переменных?
Переменные должны быть инициализированы во время объявления или в static блоке.
Дайте определение понятию “интерфейс”.
Ключевое слово interface используется для создания полностью абстрактных классов. Создатель интерфейса определяет имена методов, списки аргументов и типы возвращаемых значений, но не тела методов.
Наличие слова interface означает, что именно так должны выглядеть все классы, которые реализуют данный интерфейс. Таким образом, любой код, использующий конкретный интерфейс, знает только то, какие методы вызываются для этого интерфейса, но не более того.
Какие модификаторы по умолчанию имеют поля и методы интерфейсов?
Интерфейс может содержать поля, но они автоматически являются статическими (static) и неизменными (final). Все методы и переменные неявно объявляются как public.
. Почему нельзя объявить метод интерфейса с модификатором final или static?
Final модификатор просто бессмысленный. Все методы по умолчанию абстрактные, т.е. их невозможно создать не реализовав где-то еще, но это нельзя будет сделать, если у метода идентификатор final.
Каким образом из вложенного класса получить доступ к полю внешнего класса?
Если вложенный класс не статический и поле не статическое, то можно просто обратиться к этому полю из внутреннего класса, если только у внутреннего класса не существует поля с таким же литералом, в этом случае нужно обращаться через ссылку на внешний класс так — OuterClass.this.имяПоля
Какие вы знаете способы запустить некоторое действие в отдельном потоке
Thread,Runnable
как запустить поток через Runnable
public class Program { public static void main(String[] args) { Thread potokB = new Thread(new Runnable()х { public void run() { System.out.println("Привет из побочного потока!"); } }); potokB .start();
class KodA implements Runnable { public void run() { System.out.println(“Привет из побочного потока!”); }
public class Program static KodA kodA; public static void main(String[] args) { kodA= new KodA (); Thread potokB = new Thread(kodA); potokB .start(); }}
как запустить поток через Thread
class AffableThread extends Thread{ @Override public void run()х { System.out.println("Привет из побочного потока!"); }}
public class Program{ static AffableThread mSecondThread;
public static void main(String[] args) { mSecondThread = new AffableThread(); mSecondThread.start(); }}
Завершение потока
public class ThreadClass extends Thread { boolean a=true; public void run(){ while(!a) //выключатель { Thread.sleep(1500); ///спим } Thread.Stop(); } }
Какие ключевые слова Java, связанные с многопоточностью Вы знаете?
Я много интересных слов знаю, расскажите лучше, что из этого вы используете на проекте
Для чего используется ключевое слово syhcronized?
Захватить монитор обьекта public void myMethod(){ private Object key = new Object(); synchronized (key) { System.out.println("Hi I'm synchronized block!"); }}
либо
synchronized void myMethod() {
System.out.println(“Hi I’m synchronized method!”);
}
Недостатком использования synchronized является как раз то, что другие потоки вынуждены ждать, пока нужный объект или метод освободится.
Есть некоторый метод, который исполняет операцию i++. Переменная i типа int. Предполагается, что код будет исполнятся в многопоточной среде. Следует ли синхронизировать блок?
Да. В противном случае будут race condition…значение будет не всегда актуальным
инкремент/декремент - не атомарные операции
Что служит в качестве mutex, если метод объявлен synchronized?
Экземпляр данного класса…он является тем самым семафором
Можно ли вызвать в разных потоках два synchronized метода одного и того же объекта
нет, второй поток будет ждать, отпущеного монитора
Для чего используется ключевое слово volatile?
Не используется кэш (имется ввиду область памети в которой JVM может сохранять локальную копию переменной, чтобы уменьшить время обращения к переменной) при обращении к полю.
Для чего используется ключевое слово transient?
Для указание того, что при сериализации/десериализации данное поле не нужно сериализовать/десериализовывать.
wait()
Приводит поток в ожидание, пока другой поток не вызовит notify() или notifyAll() методы для этого объекта. При этом все эти методы должны быть вызваны в блоке synchronized.