C, PHP, VB, .NET

Дневникът на Филип Петров


* Статични вложени член класове

Публикувано на 15 октомври 2009 в раздел ПИК3 Java.

Вече се запознахме с не-статични вложени член класове. За дефинирането на понятието "статичен вложен член клас" е много подходяща аналогията с вече познатите статични методи. Нека си припомним главните характеристики на статичните методи:

  1. Те са общовалидни за всички инстанции на класа;
  2. Могат да бъдат извиквани без инстанция;
  3. Могат да променят и достъпват всички статични полета на класа;
  4. Не могат да променят или достъпват не-статични полета и методи на класа.

Абсолютно същите принципи са валидни и за статичните класове. Когато един вложен клас е статичен то той:

  1. Е общовалиден за всички инстанции на външния клас;
  2. Има достъп само до статичните полета и методи на своя външен клас;
  3. Може да бъде инициализиран без да е нужна инстанция на външния клас;
  4. Няма достъп до не-статичните полета и методи на своя външен клас.

Нека дадем един пример за клас, който има два вложени класа - статичен и не-статичен:

public class innerClassesExample{
 public static void main(String[] args){
   // Инстанция на външен клас
   MessagesClass m = new MessagesClass("testing outer class");
   // Извикване на не-статичен метод от външен клас
   m.getMsg();
   // Извикване на статичен метод от външен клас чрез инстанция
   m.defaultMessage();
   // Извикване на статичен метод от външен клас без инстанция
   MessagesClass.defaultMessage();
   // Инстанция на вложен не-статичен клас
   MessagesClass.InnerClass m2 = 
          m.new InnerClass("testing inner non-static class");
   // Извикване на не-статичен метод от вложен не-статичен клас
   m2.innerNonStaticMethod();
   // Инстанция на вложен статичен клас:
   MessagesClass.InnerStaticClass m3 = 
          new MessagesClass.InnerStaticClass("testing inner static class");
   // Извикване на не-статичен метод от вложен статичен клас:
   m3.innerStaticClassNonStaticMethod();
   // Извикване на статичен метод от вложен статичен клас:
   m3.innerStaticClassStaticMethod();
   // Извикване на статичен метод от вложен статичен клас без инстанция:
   MessagesClass.InnerStaticClass.innerStaticClassStaticMethod();
 }
}

class MessagesClass{
  private String msg;
  public MessagesClass(String msg){
    this.msg=msg;
  }
  void getMsg(){
    System.out.println(this.msg);
  }
  static void defaultMessage(){
    System.out.println("Hello World");
  }

  class InnerClass{
    String innerNonStaticClassMsg;
    public InnerClass(String msg){
      this.innerNonStaticClassMsg = msg;
    }
    public void innerNonStaticMethod(){
      System.out.println("Innerclass.msg: "+this.innerNonStaticClassMsg);
      System.out.println("Innerclass calls Outerclass.msg: "+msg);
      System.out.print("Innerclass calls Outerclass.getMsg(): ");
      getMsg();
      System.out.print("Innerclass calls Outerclass.defaultMessage(): ");
      defaultMessage();
    }
  }

  static class InnerStaticClass{
    String innerStaticClassMsg;
    public InnerStaticClass(String msg){
      this.innerStaticClassMsg = msg;
    }
    public void innerStaticClassNonStaticMethod(){
      System.out.println("InnerStaticClass.msg: "+this.innerStaticClassMsg);
      // System.out.println("InnerStaticClass calls Outerclass.msg: "+msg); <<< No
      // System.out.print("InnerStaticClass calls Outerclass.getMsg(): "); <<< No
      // getMsg(); <<< No
      System.out.print("InnerStaticClass calls Outerclass.defaultMessage(): ");
      defaultMessage();
    }
    public static void innerStaticClassStaticMethod(){
      // System.out.println("InnerStaticClass.msg: "+this.innerStaticClassMsg); <<< No
      // System.out.println("InnerStaticClass calls Outerclass.msg: "+msg); <<< No
      // System.out.print("InnerStaticClass calls Outerclass.getMsg(): "); <<< No
      // getMsg(); <<< No
      System.out.print("InnerStaticClass calls Outerclass.defaultMessage(): ");
      defaultMessage();
    }
  }
}

С този пример всъщност демонстрирахме друго важно свойство на вложените класове - те имат достъп до private променливите на външните им класове. Вложените не-статични класове не могат да имат статични методи (за разлика от вложените статични класове).

Нека се опитаме да направим една аналогия за двата типа вложени член класове:

  • Ако един вложен клас е не е статичен, то можем да си го представим като подпрограма, която зависи пряко от инстанцията на главната програма;
  • Ако един вложен клас е статичен, то можем да си го представим отново като подпрограма, която може да бъде изпълнена и самостоятелно, независимо от инстанциите на главната програма.

Най-често в практиката ако създаваме не-статични вложени член класове, те ще са private, т.е. за вътрешно ползване от външния им клас. Обратно - по-често ако пишем вложени статични класове, то те ще са публични.

 



Добави коментар

Адресът на електронната поща няма да се публикува


*