* Статични вложени член класове
Публикувано на 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, т.е. за вътрешно ползване от външния им клас. Обратно - по-често ако пишем вложени статични класове, то те ще са публични.
Добави коментар