JavaRush /Blog Java /Random-MS /Aras 24. Jawapan kepada soalan temu bual mengenai topik a...
zor07
Tahap
Санкт-Петербург

Aras 24. Jawapan kepada soalan temu bual mengenai topik aras

Diterbitkan dalam kumpulan
Tahap 24. Jawapan kepada soalan temu bual mengenai topik tahap - 1
  1. Untuk apa kelas dalaman tanpa nama dikompilasi?

    Kelas dalaman tanpa nama disusun ke dalam внешнийКласс$n.class. Sebagai ganti kelas luar, oleh itu, ialah nama kelas pembingkaian, di mana kelas dalam tanpa nama diterangkan. Di tempat n ialah nombor dari 1 hingga bilangan kelas tanpa nama.

  2. Adakah mungkin untuk mewarisi kelas dalaman?

    Adalah mungkin untuk mewarisi kelas dalaman daripada orang lain.

    Warisan daripada kelas dalam adalah sedikit lebih rumit daripada biasa, kerana pembina kelas dalam dikaitkan dengan rujukan kepada objek luar di sekelilingnya. Masalahnya ialah rujukan objek "tersembunyi" kelas luar yang melampirkan mesti dimulakan, dan tidak ada lagi objek yang melampirkan lalai dalam kelas terbitan. Untuk menunjukkan secara eksplisit objek luaran yang melampirkan, sintaks khas 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 memanjangkan kelas dalam dan bukan kelas luar. Tetapi apabila ia datang untuk mencipta pembina, pembina lalai yang disediakan tidak sesuai dan anda tidak boleh hanya menghantar rujukan kepada objek luaran. Anda mesti memasukkan ungkapan dalam badan pembina linkНаОбъемлющийКласс.super();. Ia akan memberikan pautan yang hilang dan program akan disusun.

  3. Adakah mungkin untuk mewarisi kelas dalaman tanpa nama?

    Dengan menerangkan kelas tanpa nama, kami sudahpun mewarisi daripada beberapa kelas atau melaksanakan beberapa antara muka. Perkataan extend atau implement tidak boleh digunakan secara langsung pada kelas tanpa nama, tetapi tiada siapa yang mengganggu anda untuk menyediakan lebih awal dan melanjutkan antara muka yang diperlukan, yang akan kami laksanakan menggunakan kelas tanpa nama. Contoh dalam kod di bawah.

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

    Anda tidak boleh mewarisi daripada kelas tanpa nama.

  4. Adakah mungkin untuk mengatasi kelas dalaman?

    Mengatasi kelas dalaman seolah-olah kaedah lain kelas luar sebenarnya tidak mempunyai kesan:

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

    Pembina lalai disintesis secara automatik oleh pengkompil dan memanggil pembina lalai dari kelas asas. Anda mungkin berfikir bahawa apabila mencipta objek, BigEggkelas "overridden" harus digunakan Yolk, tetapi ini tidak semestinya berlaku, seperti yang dapat dilihat daripada hasil program.

    Contoh ini hanya menunjukkan bahawa apabila anda mewarisi daripada kelas luar, tiada apa yang istimewa berlaku kepada kelas dalam. Kedua-dua kelas dalaman adalah entiti yang berasingan sepenuhnya, dengan ruang nama bebas. Dalam erti kata lain, ia adalah mustahil.

  5. Apakah batasan kelas tempatan?

    Mula-mula, mari kita ingat apa itu kelas tempatan. Ini ialah kelas yang diterangkan dalam blok kod, iaitu, secara ringkas - antara petikan {}. Selalunya petikan ini adalah badan kaedah. Tetapi mereka juga boleh menjadi hanya blok, blok statik, badan if-s, gelung, dll.

    Kelas tempatan dikurniakan ciri-ciri kelas dalaman, tetapi mempunyai ciri-ciri tersendiri, iaitu:

    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. Сколько у класса максимально может быть внутренних классов?

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

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