Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Java собеседование вопросы и ответы.docx
Скачиваний:
7
Добавлен:
01.05.2025
Размер:
88 Кб
Скачать
☆

13. Если у класса-родителя есть метод, объявленный как private, может ли наследник расширить его видимость? а если protected? а сузить видимость?

private методы никто, кроме самого класса не видит. Поэтому их наличие/отсутствие никак не отражается на классах-наследниках. Они с легкостью могут объявлять методы с такой же сигнатурой и любыми модификаторами. Но это плохой тон!  Также клас наследник может расширить видимость protected-метода. Сузить видимость класс-наследник не может. 14. Что означает ключевое слово final?

В случае класса - нельзя от него наследоваться. В случае метода - нельзя его переопределять. Также java позволяет объявлять final аргументы методов, тогда метод их не может изменить.

В случае члена класса final означает константу, которая после инициализации не поменяет своего значения.Для примитивов finalделает постоянным значение, а для ссылки на объект постоянной становится ссылка(тогда как объект может изменяться).А такая ссылка уже не может указывать на другой объект.

 15. Имеет ли смысл объявлять метод private final?

Не имеет, так как private метод не виден в наследниках, соответственно не может быть переопределен 16. Какие особенности инициализации final переменных?

Если final переменная, объявленная как не static, не инициализируется при объявлении или этого ЯВНО не происходит в теле конструктора или блоке инициализации, то это приведет к ошибке компиляции. Final переменные, объявленные как static, должны быть проинициализированы при объявлении или в блоке инициализации, также объявленном как static. В противном случае, опять получится ошибка компиляции.

17. Что будет, если единственный конструктор класса объявлен как final?

Ошибка компиляции. Так как конструкторы не наследуются то нет смысла объявлять их final.Конструктор не может быть abstract,static, final, native, or synchronized 18. Что означает ключевое поле static? Когда вы объявляете что-либо как static, это означает, что данные или метод не привязаны к определенному экземпляру этого класса. Поэтому, даже если вы никогда не создавали объектов класса, вы можете вызвать статический метод или получить доступ к статическим данным. С обычным объектом вам необходимо сначала создать его и использовать для вызова метода или доступа к информации, так как нестатические данные и методы должны точно знать объект, с которым работают.

19. К каким конструкциям Java применим модификатор static?

К методам и данным, внутренним класам( Модификатор static применим только ко внутреннимм (inner) классам, т.е. классам, описанным внутри других классов. Если внутренний класс static - то к нему извне охватывающего класса можно обратиться с помощью "ИмяОхватывающегоКласса.ИмяВнутреннегоКласса". Иначе - только через "экземпляр.ИмяВнутреннегоКласса".) 20. Что будет, если в static блоке кода возникнет исключительная ситуация?

Возникнет Exception. Oбъект класса создан не будет.

Вобщем полного ответа не знаю, может кто просветит?

21. Можно ли перегрузить static метод?

Статические методы могут перегружаться нестатическими и наоборот – без ограничений.

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

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

То есть:

Для создания объекта статического внутреннего класса не нужен объект внешнего класса.

Из объекта статического вложенного класса нельзя обращаться к нестатическим членам внешнего класса напрямую

И еще обычные внутренние классы не могут содержать статические методы и члены.

Зачем вообще нужны внутренние классы? –Каждый внутренний класс способен независимо  наследовать определенную реализ-ю.Таким образом внутренний класс не ограничен при наследовании в ситуациях, когда внешний класс уже наследует реализацию. То есть это как бы вариант решения проблемы множественного наследования.

  23. Какие особенности инициализации final static переменных?

Final переменные, объявленные как static, должны быть проинициализированы при объявлении или в блоке инициализации, также объявленном как static. В противном случае,получится ошибка компиляции.

24. Какие типы классов бывают в java (вложенные… и.т.д.)

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

public class Parcel1 {

  class Contents {

    private int i = 11;

    public int value() { return i; }

  }

  class Destination {

    private String label;

    Destination(String whereTo) {

      label = whereTo;

    }

    String readLabel() { return label; }

  } 

Вложенный класс- это статический внутренний класс(ссылка на объект внешнего класса не нужна)

Безымянный внутренний клас

//: innerclasses/Parcel7.java

// Returning an instance of an anonymous inner class.

public class Parcel7 {

  public Contents contents() {

    return new Contents() { // Insert a class definition

      private int i = 11;

      public int value() { return i; }

    }; // Semicolon required in this case

  }

  public static void main(String[] args) {

    Parcel7 p = new Parcel7();

    Contents c = p.contents();

  }

} ///:~

Это объявление эквивалентно:

The next example looks a little odd:

/: innerclasses/Parcel7b.java

// Expanded version of Parcel7.java

public class Parcel7b {

  class MyContents implements Contents {

    private int i = 11;

    public int value() { return i; }

  }

  public Contents contents() { return new MyContents(); }

  public static void main(String[] args) {

    Parcel7b p = new Parcel7b();

    Contents c = p.contents();

  }

} ///:~

Локальный внутренний клас-  внутренний класс расположенный внутри блока кода или метода 25. Каким образом из вложенного класса получить доступ к полю внешнего класса.

Если класс внутренний то: Внешнийкласс.this.Поле внешнего класса

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

В объекте обычного внутреннего класса хранится ссылка на объект внешнего класса. Внутри статического внутреннего класса такой ссылки нет.

То есть:

Для создания объекта статического внутреннего класса не нужен объект внешнего класса.

Из объекта статического вложенного класса нельзя обращаться к нестатическим членам внешнего класса напрямую

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

27. Каким образом можно обратиться к локальной переменной метода из анонимного класса, объявленного в теле этого метода? Есть ли каке-нибудь ограничения для такой переменной?

Эта переменная в методе содержащем анонимный класс должна быть final,иначе ошибка компиляции. Обратится к ней можна напрямую.

27.1 Какие бывают ссылки?

Ссылка в программировании — это объект, указывающий на определенные данные, но не хранящий их.

1. сильные ссылки (strong reference). Это обычные ссылки которые мы всегда используем. Когда мы объявляем Rectangle rect = newRectangle(), то объект на который ссылается rect не может быть удален сборщиком мусора из памяти до тех пор, пока на этот объект есть хотя бы одна сильная ссылка;

2. мягкие ссылки (SoftReference). Объявление мягкой ссылки выглядит так:

SoftReference<Rectangle> rect = new SoftReference<Rectangle>(new Rectangle());

Для получения самого объекта Rectangle можно воспользоваться методом  rect.get(). Метод get() объявлен у класса Reference, от которого наследуются SoftReference, WeakReference, PhantomReference. Важно понимать, что метод get() может вернуть null. Это происходит в том случае, когда память вашей программы заполнена и появляется вероятность возникновения OutOfMemoryError, тогда сборщик мусора удаляет объекты на которые ссылаются мягкие ссылки. Именно этот вид ссылок удобно использовать для кеширования объектов.

3.слабые ссылки:

WeakReference<Rectangle> rect = new WeakReference<Rectangle>(new Rectangle());

Разница в том, что объект на который ссылается слабая ссылка может быть удален в любой момент при вызове cборщика мусора, т.е. для этого не обязательно условие нехватки памяти. 28. Какие вы знаете способы запустить некоторое действие в отдельном потоке?

1.Создать класс MyThread реализующий интерфейс Runnable.Прописать у него метод run().B И дальше создатьобъект класса Thread:

Thread t=new Thread(new MyThread);

t.start();

2. Практически тоже самое но с использованием пулов потоков

3.наследовать класс MyThread напрямую от класса Thread.Метод старт прописать в конструкторе MyThread,тогда поток будет запускаться при создании объекта класса MyThread. Запускать потоки из конструктора класса не рекомендуется.

29. Какие вы знаете способы прекратить выполнение потока?

Завершение потока:

1.Поток завершается при выходе из метода Run(),Класса реализующего интерфейс Runnable(или наследующего класс Thread).

2.System.exit(0);

Приостановка потока:

1.Каждый поток может вызвать метод join,чтобы дождаться завершения другого потока перед своим продолжением. Если текущий поток вызывает метод t.join() для другого потока t, то вызывающий поток приостанавливается до момента окончания потока t. Вызовjoin() может быть прерван вызовом interrupt() для потока инициатора.Поэтому требуется обертка try..catch для join().

2.h.sleep может быть прерван вызовом interrupt() .Поэтому требуется обертка try..catch

30. Какие ключевые слова Java, связанные с многопоточностью Вы знаете?

syncronized: Любой метод получающий доступ к общему ресурсу может быть объявлен как synchronized. Это означает что если задача выполняется внутри одного из synchronized методов ,то все остальные потоки не сумеют зайти ни в какой  syncronized метод данного объекта,  пока первый поток не вернется из своего вызова

volatile-

Поток создается с чистой рабочей памятью и должен перед использованием загрузить все необходимые переменные из основного хранилища(можна сказать что он имеет некий кеш). Любая переменная сначала создается в основном хранилище и лишь затем копируется в рабочую память потоков, которые будут ее применять. Если переменная объявлена , как volatile, то ее чтение и запись будет прозводится из\в основное хранилище.

чтение volatile переменных синхронизировано и запись в volatile переменные синхронизирована, а неатомарные операции – нет.

31. Для чего используется ключевое слово syhcronized?

syncronized: Любой метод получающий доступ к общему ресурсу может быть объявлен как synchronized.Это означает что если задача выполняется внутри одного из synchronized методов ,то все остальные потоки не сумеют зайти ни в какой  Syncronized метод данного объекта   пока первый поток не вернется из своего вызова

32. Есть некоторый метод, который исполняет операцию i++. Переменная i типа int. Предполагается, что код будет исполнятся в многопоточной среде. Следует ли синхронизировать блок?

Да, даже если переменная будет volatile(на тот случай если изменения будут храниться в локальном кеше процессора) 33. Что служит в качестве mutex, если метод объявлен synchronized?

Мьютекс -объект, позволяющий войти в заданный участок кода не более чем 1 потоку. Каждый объект в java содержит некий объект простой блокировки, также называемый монитором. При вызове любого синхронизированного метода (syncronized) объект переходит в состояние блокировки до тех пор пока этот метод не закончит свою работу и не снимет блокировку, другие synchronized методы для объекта не могут быть вызваны.

Объект блокировки. Можно и явно создавать объект блокировки. Брюс Еккель с583

Также существут отдельный объект блокировки для класса(монитор для класса), который следит за тем ,чтобы статическиеsynchronized методы не использовали одновременоо общие статические данные класса. 34. Можно ли вызвать в разных потоках два synchronized метода одного и того же объекта?

нет 35. Что используется в качестве mutex, если метод объявлен static synchronized? Можно ли создавать новые экземпляры класса, пока выполняется static synchronized метод?

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

Да можна создавать новые екземпляры класса, так как статические поля не принадлежат к экземплярам 36. Объясните, что такое deadlock? Приведите пример кода, который демонстрирует deadlock.

При работе с блокировками всегда надо помнить о возможности появления deadlock– взаимных блокировок, которые приводят к зависанию программы. Если один поток заблокировал один ресурс и пытается заблокировать второй, а другой поток заблокировал второй и пытается заблокировать первый, то такие потоки уже никогда не выйдут из состояния ожидания. 37. Для чего используется ключевое слово volatile?