JavaRush /Java Blog /Random-TK /24-nji dereje. Dereje derejesindäki söhbetdeşlik soraglar...
zor07
Dereje
Санкт-Петербург

24-nji dereje. Dereje derejesindäki söhbetdeşlik soraglaryna jogaplar

Toparda çap edildi
24-nji dereje. 1-nji dereje temasyndaky söhbetdeşlik soraglaryna jogaplar - 1
  1. Anonim içki synplar nämäni düzýär?

    Anonim içki synplar jemlenýär внешнийКласс$n.class. Daşarky synpyň ýerine, degişlilikde näbelli içki synpyň beýan edilýän çarçuwaly synpyň ady bar. N ýerinde 1-den başlap, näbelli synplaryň sanyna çenli san bar.

  2. Içki synplary miras alyp bolarmy?

    Içerki synplary beýlekilerden miras alyp bolýar.

    Içki synpdan miras, adatdakysyndan birneme çylşyrymly, sebäbi içki synpyň konstruktory daş-töweregi daşarky jisime salgylanmak bilen baglanyşykly. Mesele, daşarky synpyň "gizlin" obýekt salgylanmasy başlangyç bolmaly we alnan synpda deslapky ýapyk obýekt ýok. Daşky obýekti aç-açan görkezmek üçin ýörite sintaksis ulanylýar:

    //: 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 ýerde synp InheritInnerdiňe daşky synpy däl-de, içki synpy giňeldýär. Aöne konstruktor döretmek barada aýdylanda, berlen deslapky konstruktor laýyk däl we diňe daşarky bir obýekte salgylanma berip bilmersiňiz. Konstruktoryň göwresine aňlatma goşmaly linkНаОбъемлющийКласс.super();. Theitirilen baglanyşygy üpjün eder we programma düzer.

  3. Anonim içki synplary miras alyp bolarmy?

    Anonim synpy suratlandyrmak bilen, eýýäm käbir synplardan miras alýarys ýa-da käbir interfeýsi durmuşa geçirýäris. Sözleri uzaldýar ýa-da ýerine ýetirýär, anonim synplara gönüden-göni ulanylyp bilinmez, ýöne hiç kim sizi öňünden taýýarlamak we gerekli interfeýsi giňeltmek üçin biynjalyk edenok, biz näbelli synp ulanyp durmuşa geçireris. Aşakdaky kodda mysal.

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

    Anonim synpdan miras alyp bilmersiňiz.

  4. Içki synplary ýok edip bolarmy?

    Içki synpy daşarky synpyň başga bir usuly ýaly ýok etmek aslynda hiç hili täsir etmeýär:

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

    Netije:

    New Egg()
    Egg.Yolk()

    Adaty konstruktor düzüji tarapyndan awtomatiki sintez edilýär we esasy synpdan deslapky konstruktory çagyrýar. Obýekt döredilende BigEgg“artykmaç” synp ulanylmaly diýip pikir edip bilersiňiz Yolk, emma programmanyň netijesinden görnüşi ýaly bu asla beýle däldir.

    Bu mysal, daşarky synpdan miras alanyňyzda içerki synplarda üýtgeşik bir zadyň bolmaýandygyny görkezýär. Iki içki synp, garaşsyz at giňişlikleri bilen düýbünden aýry bir zat. Başgaça aýdylanda, bu mümkin däl.

  5. Localerli synplaryň çäklendirmeleri näme?

    Ilki bilen ýerli synpyň nämedigini ýada salalyň. Bu kodlar toplumynda, ýagny ýönekeý sözler bilen - sitatalaryň arasynda beýan edilen synp {}. Köplenç bu sitatalar usulyň özenidir. Alsoöne olar diňe bir blok, statiki blok, if-s, aýlaw we ş.m. bolup biler.

    Classerli synpda içerki synplaryň aýratynlyklary bar, ýöne tapawutly aýratynlyklary bar:

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

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

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