JavaRush /Java Blog /Random-ID /Level 24. Jawaban pertanyaan wawancara pada topik level
zor07
Level 31
Санкт-Петербург

Level 24. Jawaban pertanyaan wawancara pada topik level

Dipublikasikan di grup Random-ID
Level 24. Jawaban pertanyaan wawancara tentang topik level - 1
  1. Untuk apa kelas dalam anonim dikompilasi?

    Kelas dalam anonim dikompilasi menjadi внешнийКласс$n.class. Oleh karena itu, sebagai pengganti kelas luar adalah nama kelas pembingkaian, di mana kelas dalam anonim dijelaskan. Di tempat n adalah angka dari 1 sampai jumlah kelas anonim.

  2. Apakah mungkin untuk mewarisi kelas dalam?

    Dimungkinkan untuk mewarisi kelas dalam dari orang lain.

    Warisan dari kelas dalam sedikit lebih rumit dari biasanya, karena konstruktor kelas dalam dikaitkan dengan referensi ke objek luar di sekitarnya. Masalahnya adalah referensi objek "tersembunyi" dari kelas terluar yang terlampir harus diinisialisasi, dan tidak ada lagi objek terlampir default di kelas turunan. Untuk secara eksplisit menunjukkan objek eksternal yang terlampir, sintaks khusus digunakan:

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

    Di sini kelas InheritInnerhanya memperluas kelas dalam dan bukan kelas luar. Namun ketika membuat konstruktor, konstruktor default yang disediakan tidak cocok dan Anda tidak bisa begitu saja meneruskan referensi ke objek eksternal. Anda harus menyertakan ekspresi di badan konstruktor linkНаОбъемлющийКласс.super();. Ini akan memberikan tautan yang hilang dan program akan dikompilasi.

  3. Apakah mungkin untuk mewarisi kelas dalam anonim?

    Dengan mendeskripsikan kelas anonim, kita sudah mewarisi dari beberapa kelas atau mengimplementasikan beberapa antarmuka. Kata extends atauimplement tidak dapat langsung diterapkan pada kelas anonim, namun tidak ada yang mengganggu Anda untuk mempersiapkan terlebih dahulu dan memperluas antarmuka yang diperlukan, yang akan kami implementasikan menggunakan kelas anonim. Contohnya pada kode di bawah ini.

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

    Anda tidak dapat mewarisi dari kelas anonim.

  4. Apakah mungkin untuk mengganti kelas dalam?

    Mengganti kelas dalam seolah-olah itu adalah metode lain dari kelas luar sebenarnya tidak berpengaruh:

    //: 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();
      }
    }

    Kesimpulan:

    New Egg()
    Egg.Yolk()

    Konstruktor default secara otomatis disintesis oleh kompiler dan memanggil konstruktor default dari kelas dasar. Anda mungkin berpikir bahwa saat membuat objek, BigEggkelas yang "ditimpa" harus digunakan Yolk, tetapi hal ini tidak terjadi, seperti yang terlihat dari hasil program.

    Contoh ini hanya menunjukkan bahwa ketika mewarisi dari kelas luar, tidak ada hal istimewa yang terjadi pada kelas dalam. Kedua kelas dalam adalah entitas yang benar-benar terpisah, dengan namespace independen. Dengan kata lain, hal itu tidak mungkin.

  5. Apa batasan kelas lokal?

    Pertama, mari kita ingat apa itu kelas lokal. Ini adalah kelas yang dijelaskan dalam blok kode, yaitu secara sederhana - di antara tanda kutip {}. Seringkali kutipan ini adalah inti dari metode ini. Namun bisa juga berupa blok, blok statis, badan if-s, loop, dan lain-lain.

    Kelas lokal diberkahi dengan ciri-ciri kelas internal, namun mempunyai ciri khas, yaitu:

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

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

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

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

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

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

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

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

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

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

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

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

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

    Да, можно.

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

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

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

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

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

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