JavaRush /Java blogi /Random-UZ /24-daraja. Daraja mavzusi bo'yicha suhbat savollariga jav...
zor07
Daraja
Санкт-Петербург

24-daraja. Daraja mavzusi bo'yicha suhbat savollariga javoblar

Guruhda nashr etilgan
24-daraja. Daraja mavzusi bo'yicha suhbat savollariga javoblar - 1
  1. Anonim ichki sinflar nima uchun tuziladi?

    Anonim ichki sinflar tuzilgan внешнийКласс$n.class. Tashqi sinf o'rniga, mos ravishda, anonim ichki sinf tasvirlangan ramka sinfining nomi. n o'rnida 1 dan anonim sinflar sonigacha bo'lgan raqam.

  2. Ichki sinflarni meros qilib olish mumkinmi?

    Boshqalardan ichki sinflarni meros qilib olish mumkin.

    Ichki sinfdan meros olish odatdagidan biroz murakkabroq, chunki ichki sinf konstruktori atrofdagi tashqi ob'ektga havola bilan bog'liq. Muammo shundaki, o'rab turgan tashqi sinfning "yashirin" ob'ekt havolasi ishga tushirilishi kerak va olingan sinfda endi sukut bo'yicha yopish ob'ekti yo'q. Yopuvchi tashqi ob'ektni aniq ko'rsatish uchun maxsus sintaksis qo'llaniladi:

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

    Bu erda sinf InheritInnertashqi sinfni emas, balki faqat ichki sinfni kengaytiradi. Ammo konstruktor yaratish haqida gap ketganda, taqdim etilgan standart konstruktor mos kelmaydi va siz shunchaki tashqi ob'ektga havolani uzata olmaysiz. Konstruktorning tanasiga ifodani kiritishingiz kerak linkНаОбъемлющийКласс.super();. U etishmayotgan havolani beradi va dastur kompilyatsiya qiladi.

  3. Anonim ichki sinflarni meros qilib olish mumkinmi?

    Anonim sinfni tavsiflash orqali biz allaqachon ba'zi sinfdan meros qilib olamiz yoki ba'zi interfeyslarni amalga oshirmoqdamiz. Extens yoki implements so'zlarini to'g'ridan-to'g'ri anonim sinflarga qo'llash mumkin emas, lekin hech kim sizni oldindan tayyorgarlik ko'rish va kerakli interfeysni kengaytirish uchun bezovta qilmaydi, biz buni anonim sinf yordamida amalga oshiramiz. Quyidagi koddagi misol.

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

    Siz anonim sinfdan meros ololmaysiz.

  4. Ichki sinflarni bekor qilish mumkinmi?

    Tashqi sinfning boshqa usuli kabi ichki sinfni bekor qilish aslida hech qanday ta'sir qilmaydi:

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

    Xulosa:

    New Egg()
    Egg.Yolk()

    Standart konstruktor kompilyator tomonidan avtomatik ravishda sintezlanadi va asosiy sinfdan standart konstruktorni chaqiradi. Ob'ektni yaratishda BigEgg"o'chirilgan" sinfdan foydalanish kerak deb o'ylashingiz mumkin Yolk, ammo dastur natijasidan ko'rinib turibdiki, bu hech qanday holatda emas.

    Bu misol shuni ko'rsatadiki, tashqi sinfdan meros bo'lganda, ichki sinflarga hech qanday maxsus narsa bo'lmaydi. Ikki ichki sinf mustaqil nomlar bo'shliqlari bilan butunlay alohida ob'ektlardir. Boshqacha aytganda, bu mumkin emas.

  5. Mahalliy sinflarning cheklovlari qanday?

    Birinchidan, mahalliy sinf nima ekanligini eslaylik. Bu kod blokida tasvirlangan sinf, ya'ni oddiy so'zlar bilan aytganda - tirnoq orasida {}. Ko'pincha bu tirnoqlar usulning asosiy qismidir. Ammo ular shunchaki blok, statik blok, if-lar tanasi, halqalar va boshqalar bo'lishi mumkin.

    Mahalliy sinf ichki sinflarning xususiyatlariga ega, ammo o'ziga xos xususiyatlarga ega, xususan:

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

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

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