User zor07
zor07
31 уровень
Санкт-Петербург

Уровень 23. Ответы на вопросы к собеседованию по теме уровня

Статья из группы Архив info.javarush.ru
Уровень 23. Ответы на вопросы к собеседованию по теме уровня - 1
  1. Какие бывают внутренние классы?

    • Вложенные классы делятся на два вида: статические и не статические.
    • Вложенные классы, объявленные как статические называются вложенными статическими (static nested classes).
    • Вложенные не статические классы называются внутренними (inner classes).
  2. Во что компилируется анонимный внутренний класс?

    Во внутренний не статический класс

  3. Зачем использовать ключевое слово final при создании анонимных классов?

    Если определяется анонимный внутренний класс и ему нужно при этом использовать объекты, определенные вне этого внутреннего класса, компилятор требует, чтобы переданные на них ссылки объявлялись неизменными (final). Без такого объявления вы получите сообщение об ошибке при компиляции программы.

  4. Как правильно создать объект внутреннего класса?

    Внутренние (не статические) классы, как переменные и методы связаны с объектом внешнего класса. Внутренние классы так же имеют прямой доступ к полям внешнего класса. Такие классы не могут содержать в себе статические методы и поля. Внутренние классы не могут существовать без экземпляра внешнего. Для создания объекта:

    
    Outer outer = new Outer();
    Innter inner = outer.new Inner();
    
  5. Как правильно создать объект вложенного класса?

    Синтаксис создания объекта вложенного класса:

    
    OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();
    
  6. Можно ли создавать статические методы/переменные во внутреннем классе?

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

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

  7. Назовите три любых внутренних класса?

    1. private static class Holder —вложенный класс HashMap из java.util.
    2. В интерфейсе Map есть interface Entry<K,V>, который опять же в HashMap и реализуется в другом вложенном классе static class Entry<K,V> implements Map.Entry<K,V>.
    3. private static class IntegerCache в классе Integer.
  8. Как внутренние классы решают проблему множественного наследования в Java?

    Т.к. множественное наследование классов в Java запрещено, эту проблему решают с помощью внутренних классов: в нужном нам классе мы объявляем внутренний класс и наследуем его от требуемого класса. Пример:

    
    class Tiger extends Cat
    {
    
     public void tigerRun()
     {
      .....
     }
    
    public void startTiger()
     {
      TigerThread thread = new TigerThread();
      thread.start();
     }
    
     class TigerThread extends Thread
     {
      public void run()
      {
       tigerRun();
      } 
     }
    }
    
  9. Чем отличаются анонимные классы, созданные на основе интерфейса и на основе класса?

    Анонимный класс согласно JLS 15.9.5 представляют собой выражение, в котором объявление нового класса и его инициализация совмещены:

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

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

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

  10. Можно ли создать анонимный статический вложенный класс?

    Нет, статической становится только переменная, но не класс.

Комментарии (20)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ СДЕЛАТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Sergey Уровень 25
22 августа 2021
Не могу я понять.Воту меня джава 8 стоит. Во всех 4 типах могу создать перменные и сатические и обычные

public class Bicycle {

    private int weight;

    public void testMethod() {
        class LocalInnerClass {
            static final int test = 1;
            private int u = 123;
            private static final int test2 = 1;
        }
    }

    public static void main(String args[]) {
        Seat seat = new Seat();
        seat.getSeatParam2();
        Seat.getSeatParam();
        Bicycle bycycle = new Bicycle();
        Window window = bycycle.new Window();
        window.getWindowParam();
        new ClassA() {
            int i = 23;
        };
    }

    static class Seat {
        static final int test = 1;
        private int u = 123;

        //inner class cannot have static declarations
        public static void getSeatParam() {
            System.out.println("test = " + test);
        }

        public void getSeatParam2() {
            System.out.println("test = " + test + ", u = " + u);
        }
    }

    class Window {
        static final int test = 1;
        private int u = 123;

        //inner class cannot have static declarations
        public void getWindowParam() {
            System.out.println("test = " + test + ", u = " + u);
        }
    }
}
Alexey Prilessky Уровень 40, Минск
27 апреля 2020
9 пункт : изменить поведение не за счёт перегрузки, а за счет переопределения
Tom Riddle Уровень 35, Москва, Россия
31 мая 2019
Чем отличаются анонимные классы, созданные на основе интерфейса и на основе класса? Добавил бы. Если в программе используется анонимный класс на основе интерфейса с одним методом, то его можно заменить лямбда выражением. С анонимным классом на основе другого класса такого варианта не предоставляется по естественным причинам.
Ilya Sukhov Уровень 40, Москва
24 февраля 2019
Только мне кажется, что ответ на первый вопрос не содержит ответа на первый вопрос? Внутренние (inner) классы бывают: 1) Просто внутренние классы (по определению - вложенные не-статические) 2) Локальные(local) классы (по определению - внутренние, описанные в блоке кода) 3) Анонимные(anonymous) классы (по определению - внутренние, без имени) 2 и 3 являются особыми разновидностями 1 https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html
Rosewelt Уровень 25, Украина
12 января 2018
3. Зачем использовать ключевое слово final при создании анонимных классов?
Если определяется анонимный внутренний класс и ему нужно при этом использовать объекты, определенные вне этого внутреннего класса, компилятор требует, чтобы переданные на них ссылки объявлялись неизменными (final). Без такого объявления вы получите сообщение об ошибке при компиляции программы.
However, starting in Java SE 8, a local class can access local variables and parameters of the enclosing block that are final or effectively final. A variable or parameter whose value is never changed after it is initialized is effectively final.
Core Уровень 35, Екатеринбург, Россия
1 декабря 2016
3. Зачем использовать ключевое слово final при создании анонимных классов?
Если определяется анонимный внутренний класс и ему нужно при этом использовать объекты, определенные вне этого внутреннего класса, компилятор требует, чтобы переданные на них ссылки объявлялись неизменными (final). Без такого объявления вы получите сообщение об ошибке при компиляции программы.
Вот этот ответ некорректен, на мой взягляд. Анонимный внутренний класс, как и локальный класс вполне может обратиться ко внешним переменным, определённым вне этого класса и не имеющим модификатор final. Например, если эта переменная — поле обрамляющего класса. А вот если нужно обратиться в локальном классе к локальным переменным внешнего класса или к аргументу метода, в котором определён локальный класс — тогда да, нужен модификатор final. Ниже код, который скомпилируется даже при отсутствии final у fieldOfOuterClass

<code>public class OuterClass {
    int fieldOfOuterClass = 222;
    public void someMethod(final int arg,int i){
        final int localVariableOfOuterClass = 100;
        class LocalClass{
            public void printArg(){
                System.out.println("LocalClass.printArg(field--> "+fieldOfOuterClass+" | "+arg+" <--arg),"+" localPatametr--> "+localVariableOfOuterClass);
            }
        }
        new LocalClass().printArg();
    }
    public static void main(String[] args) {
        new OuterClass().someMethod(321,123);
    }
}</code>

Я бы так ответил: модификатор final нужно использовать при возникновении необходимсоти обратиться из локального/анонимного внутреннего класса к локальным переменным внешнего класса или к аргументам метода, в котором этот локальный/анонимный внутренний класс реализован.

Могу ошибаться, но эксперименты с кодом заставили меня придти к такому выводу.
TtTt Уровень 34, Киев, Украина
11 июля 2016
Надо бы поправить:
1. Вложенные не статические классы называются внутренними (inner classes)
2. Назовите три любых внутренних класса?
private static class Holder —вложенный класс HashMap из java.util.

Сначала внутренний класс классифицирован как не статический. Затем в примере приведены статические классы. Наверное в примере должны быть нестатические классы :)
zor07 Уровень 31, Санкт-Петербург, Россия
27 июня 2016
Спасибо за замечание )
Joysi Уровень 41, Россия
20 июня 2016
1. Какие бывают внутренние классы?
Вложенные классы делятся на два вида: статические и не статические.
Вложенные классы, объявленные как статические называются вложенными статическими (static nested classes).
Вложенные не статические классы называются внутренними (inner classes).

Я бы добавил.
Помимо объявления вложенного класса внутри внешнего по отношению к нему, возможно также определить внутренний класс непосредственно в блоке кода (например, в теле метода и блоках инициализации). При этом, можно в блоке:
— объявить класс и в дальнейшем его использовать (local inner classes),
— одновременно объявить и создать класс динамически (anonymous inner classes).