* Статични вложени член класове
Публикувано на 15 октомври 2009 в раздел ПИК3 Java.
Вече се запознахме с не-статични вложени член класове. За дефинирането на понятието "статичен вложен член клас" е много подходяща аналогията с вече познатите статични методи. Нека си припомним главните характеристики на статичните методи:
- Те са общовалидни за всички инстанции на класа;
- Могат да бъдат извиквани без инстанция;
- Могат да променят и достъпват всички статични полета на класа;
- Не могат да променят или достъпват не-статични полета и методи на класа.
Абсолютно същите принципи са валидни и за статичните класове. Когато един вложен клас е статичен то той:
- Е общовалиден за всички инстанции на външния клас;
- Има достъп само до статичните полета и методи на своя външен клас;
- Може да бъде инициализиран без да е нужна инстанция на външния клас;
- Няма достъп до не-статичните полета и методи на своя външен клас.
Нека дадем един пример за клас, който има два вложени класа - статичен и не-статичен:
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, т.е. за вътрешно ползване от външния им клас. Обратно - по-често ако пишем вложени статични класове, то те ще са публични.
Добави коментар