JavaRush /Java Blogu /Random-AZ /Səviyyə 24. Səviyyə mövzusu üzrə müsahibə suallarına cava...
zor07
Səviyyə
Санкт-Петербург

Səviyyə 24. Səviyyə mövzusu üzrə müsahibə suallarına cavablar

Qrupda dərc edilmişdir
Səviyyə 24. Səviyyə - 1 mövzusu üzrə müsahibə suallarına cavablar
  1. Anonim daxili siniflər nə üçün tərtib edilir?

    Anonim daxili siniflər daxil edilir внешнийКласс$n.class. Xarici sinifin yerinə, müvafiq olaraq, anonim daxili sinifin təsvir olunduğu çərçivə sinfinin adıdır. N yerində 1-dən anonim siniflərin sayına qədər olan rəqəmdir.

  2. Daxili sinifləri miras almaq mümkündürmü?

    Daxili sinifləri başqalarından miras almaq mümkündür.

    Daxili sinifdən miras adi haldan bir az daha mürəkkəbdir, çünki daxili sinifin konstruktoru ətrafdakı xarici obyektə istinadla əlaqələndirilir. Problem ondadır ki, əhatə edən xarici sinifin "gizli" obyekt istinadı işə salınmalıdır və törəmə sinifdə artıq standart əhatə edən obyekt yoxdur. Qapalı xarici obyekti açıq şəkildə göstərmək üçün xüsusi sintaksis istifadə olunur:

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

    Burada sinif InheritInneryalnız daxili sinfi genişləndirir, xarici sinfi deyil. Ancaq konstruktor yaratmağa gəldikdə, təqdim olunan standart konstruktor uyğun deyil və siz sadəcə olaraq xarici obyektə istinad ötürə bilməzsiniz. Konstruktorun gövdəsinə ifadə daxil etməlisiniz linkНаОбъемлющийКласс.super();. O, çatışmayan linki verəcək və proqram tərtib edəcək.

  3. Anonim daxili sinifləri miras almaq mümkündürmü?

    Anonim sinfi təsvir etməklə, biz artıq hansısa sinifdən miras alırıq və ya hansısa interfeysi həyata keçiririk. Extens və ya implements sözləri birbaşa anonim siniflərə tətbiq edilə bilməz, lakin heç kim sizi əvvəlcədən hazırlamağa və anonim sinifdən istifadə edərək həyata keçirəcəyimiz tələb olunan interfeysi genişləndirməyə narahat etmir. Aşağıdakı kodda bir nümunə.

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

    Siz anonim sinifdən miras ala bilməzsiniz.

  4. Daxili sinifləri ləğv etmək mümkündürmü?

    Xarici sinfin başqa bir metodu kimi daxili sinfi ləğv etməyin əslində heç bir təsiri yoxdur:

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

    Nəticə:

    New Egg()
    Egg.Yolk()

    Defolt konstruktor kompilyator tərəfindən avtomatik sintez olunur və əsas sinifdən standart konstruktoru çağırır. Siz düşünə bilərsiniz ki, obyekt yaradarkən BigEgg“əlavə təyin edilmiş” sinifdən istifadə edilməlidir Yolk, lakin bu, proqramın nəticəsindən göründüyü kimi heç də belə deyil.

    Bu misal sadəcə onu göstərir ki, siz xarici sinifdən miras aldığınız zaman daxili siniflərdə xüsusi bir şey baş vermir. İki daxili sinif müstəqil ad boşluqları olan tamamilə ayrı qurumlardır. Başqa sözlə, mümkün deyil.

  5. Yerli siniflərin məhdudiyyətləri nələrdir?

    Əvvəlcə yerli sinifin nə olduğunu xatırlayaq. Bu, kod blokunda təsvir olunan bir sinifdir, yəni sadə dillə - dırnaqlar arasında {}. Çox vaxt bu sitatlar metodun əsas hissəsidir. Lakin onlar həm də sadəcə blok, statik blok, if-s gövdəsi, döngələr və s. ola bilər.

    Yerli sinif daxili siniflərin xüsusiyyətlərinə malikdir, lakin fərqli xüsusiyyətlərə malikdir, yəni:

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

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

Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION