JavaRush /Blog Java /Random-PL /Poziom 24. Odpowiedzi na pytania podczas rozmowy kwalifik...
zor07
Poziom 31
Санкт-Петербург

Poziom 24. Odpowiedzi na pytania podczas rozmowy kwalifikacyjnej na temat poziomu

Opublikowano w grupie Random-PL
Poziom 24. Odpowiedzi na pytania z rozmowy kwalifikacyjnej na temat poziomu - 1
  1. Do czego kompilują się anonimowe klasy wewnętrzne?

    Anonimowe klasy wewnętrzne są kompilowane do внешнийКласс$n.class. Odpowiednio w miejscu klasy zewnętrznej znajduje się nazwa klasy ramkowej, w ramach której opisana jest anonimowa klasa wewnętrzna. W miejscu n znajduje się liczba od 1 do liczby klas anonimowych.

  2. Czy można dziedziczyć klasy wewnętrzne?

    Możliwe jest dziedziczenie klas wewnętrznych od innych.

    Dziedziczenie z klasy wewnętrznej jest nieco bardziej skomplikowane niż zwykle, ponieważ konstruktor klasy wewnętrznej jest powiązany z referencją do otaczającego obiektu zewnętrznego. Problem polega na tym, że „ukryte” odwołanie do obiektu otaczającej klasy zewnętrznej musi zostać zainicjowane, a w klasie pochodnej nie ma już domyślnego obiektu otaczającego. Aby wyraźnie wskazać otaczający obiekt zewnętrzny, używana jest specjalna składnia:

    //: innerclasses/InheritInner.java
    // Наследование от внутреннего класса.
    
    class WithInner {
      class Inner {}
    }
    
    public class InheritInner extends WithInner.Inner {
      //! InheritInner() {} // He компLubруется
      InheritInner(WithInner wi) {
        wi.super();
      }
      public static void main(String[] args) {
        WithInner wi = new WithInner();
        InheritInner ii = new InheritInner(wi);
      }
    }

    Tutaj klasa InheritInnerrozszerza tylko klasę wewnętrzną, a nie zewnętrzną. Jednak jeśli chodzi o tworzenie konstruktora, dostarczony konstruktor domyślny nie jest odpowiedni i nie można po prostu przekazać referencji do obiektu zewnętrznego. Musisz zawrzeć wyrażenie w treści konstruktora połączyćНаОбъемлющийКласс.super();. Zapewni brakujące łącze i program się skompiluje.

  3. Czy można dziedziczyć anonimowe klasy wewnętrzne?

    Opisując anonimową klasę, już dziedziczymy po jakiejś klasie lub implementujemy jakiś interfejs. Słowa rozszerza lub implementuje nie można bezpośrednio zastosować do klas anonimowych, ale nikt nie przeszkadza w przygotowaniu i rozszerzaniu wymaganego interfejsu, który zaimplementujemy za pomocą klasy anonimowej. Przykład w kodzie poniżej.

    import java.awt.event.WindowListener;
    
    public class TestExtendAnonym {
        private interface MyInterface extends Runnable, WindowListener {
        }
    
        Runnable r = new MyInterface() {
        ...
        //Пример того Jak реализовать 2 и более интерфейса в анонимном классе
        };
    }

    Nie można dziedziczyć z klasy anonimowej.

  4. Czy można zastąpić klasy wewnętrzne?

    Zastąpienie klasy wewnętrznej tak, jakby była to inna metoda klasy zewnętrznej, w rzeczywistości nie ma żadnego efektu:

    //: innerclasses/BigEgg.java
    // Внутренний класс нельзя переопределить
    // подобно обычному методу,
    import static net.mindview.util.Print.*;
    
    class Egg {
      private Yolk y;
      protected class Yolk {
        public Yolk() { print("Egg.Yolk()"); }
      }
      public Egg() {
        print("New Egg()");
        y = new Yolk();
      }
    }
    
    public class BigEgg extends Egg {
      public class Yolk {
        public Yolk() { print("BigEgg.Yolk()"); }
      }
      public static void main(String[] args) {
        new BigEgg();
      }
    }

    Wniosek:

    New Egg()
    Egg.Yolk()

    Konstruktor domyślny jest automatycznie syntetyzowany przez kompilator i wywołuje konstruktor domyślny z klasy bazowej. Można by pomyśleć, że podczas tworzenia obiektu BigEggnależy zastosować „przeciążoną” klasę Yolk, jednak wcale tak nie jest, co widać po wyniku działania programu.

    Ten przykład po prostu pokazuje, że kiedy dziedziczysz z klasy zewnętrznej, z klasami wewnętrznymi nie dzieje się nic specjalnego. Dwie klasy wewnętrzne są całkowicie oddzielnymi bytami, z niezależnymi przestrzeniami nazw. Innymi słowy, jest to niemożliwe.

  5. Jakie są ograniczenia zajęć lokalnych?

    Na początek przypomnijmy sobie, czym jest klasa lokalna. Jest to klasa opisana w bloku kodu, czyli najprościej – w cudzysłowie {}. Najczęściej te cytaty stanowią treść metody. Ale mogą to być także po prostu blok, blok statyczny, treść if-s, pętle itp.

    Klasa lokalna ma cechy klas wewnętrznych, ale ma cechy charakterystyczne, a mianowicie:

    1. он имеет доступ только к финальным полям и аргументам обрамляющего метода, а также ко всем полям обрамляющего класса, в том числе приватным и статическим;
    2. локальный класс виден и может создаваться только в блоке, в котором описан;
    3. у локального класса не ставится модификатор доступа;
    4. не может иметь статических полей, методов, классов (за исключением финальных);
    5. локальный класс, объявленный в статическом блоке может обращаться только к статическим полям внешнего класса.

    Но! Начиная с Java8 мы можем обращаться в локальных классах к не финальным локальным переменным, если они не были изменены до момента инициализации класса. Также теперь стало возможным обращение к не финальным параметрам метода.

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

    Нет. У Анонимных внутренних классов, Jak и у внутренних классов не может быть статических полей, методов. (вспомним, что анонимные классы компLubруются в обычные внутренние, а те, в свою очередь, связаны с obiektом обрамляющего класса)

  7. Можно ли создать obiekt внутреннего класса, если у внешнего класса только private конструктор?

    Имея подобный kod:

    public class PrivateConst {
        private PrivateConst() {}
        public class InnerClass{
            public void f(){
                System.out.println("hello");
            }
       }
    }

    Напрямую, в другом классе (вне обрамляющего), конечно, создать obiekt InnerClass следующим способом не получится:

    PrivateConst.InnerClass priv = new PrivateConst().new InnerClass();

    Но! Co если у нас есть метод, возвращающий экземпляр

    PrivateConst:public class PrivateConst {
        private static PrivateConst instance;
        private PrivateConst() {}
    
        public static PrivateConst getInstance(){
            instance = new PrivateConst();
            return instance;
        }
    
        public class InnerClass{}
    }

    В этом случае приватный конструктор нам не помеха для создания obiektа InnerClass. Так же мы без проблем сможем создавать его в методах и в других внутренних классах, принадлежащих PrivateConst. Ответ — можно, если Jakим-либо способом нам удастся получить obiekt обрамляющего класса.

  8. Можно ли объявлять внутренние классы private?

    Да, можно.

    PS Обоснования так и не нашел, но на философии java встречались подобные примеры. Плюс IDE не ругается. Буду признателен за обоснование, но предположу, что в этом плане внутренний класс ничем не отличается от обычного класса.

  9. Можно ли объявлять анонимные внутренние классы private?

    Аналогично (в плане не нашел обоснования). Можно объявить private переменную от типа которой наследуется наш анонимный класс.

  10. Сколько у класса максимально может быть внутренних классов?

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

Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION