package org.lgy.study.innerclass;
/*
静态内部类属于外部类本身,而不属于外部类的对象。
使用静态内部类时无需创建外部类的对象。
*/
public class StaticInnerClass{
private String str1 = "non static str1 in outer";
private static String str2 = "static str2 in outer";
public void method1(){
System.out.println("non static method1 in outer");
//外部类的实例方法可以访问静态内部类的任何成员,无论该成员是静态成员还是非静态成员。
//即使是内部类的私有属性,也可以在外部类中直接访问;但必须使用类名作为调用者来访问其类成员,
//必须使用静态内部类对象作为调用者来访问其实例成员。
InnerClass in = new InnerClass();
System.out.println("in.str1 = " + in.str1);
System.out.println("InnerClass.str2 = " + InnerClass.str2);
in.method1();
InnerClass.method2();
}
public static void method2(){
System.out.println("static method2 in outer");
//外部类的类方法可以访问静态内部类的任何成员,无论该成员是静态成员还是非静态成员。
//即使是内部类的私有属性,也可以在外部类中直接访问;但必须使用类名作为调用者来访问其类成员,
//必须使用静态内部类对象作为调用者来访问其实例成员。
InnerClass in = new InnerClass();
System.out.println("in.str1 = " + in.str1);
System.out.println("InnerClass.str2 = " + InnerClass.str2);
in.method1();
InnerClass.method2();
}
public void method3(){
System.out.println("non static method3 in outer");
}
public static void method4(){
System.out.println("static method4 in outer");
}
/*
静态内部类不能访问外部类的实例成员,只能访问外部类的类成员。
即使是静态内部类的实例方法也不能访问外部类的实例成员,只能访问外部类的静态成员。
*/
private static class InnerClass{
//静态内部类里可以定义任何成员(成员变量、成员方法、静态成员、非静态成员)
private String str1 = "non static str1 in inner";
private static String str2 = "static str2 in inner";
public void method1(){
System.out.println("non static method1 in inner");
//静态内部类的实例方法也不能访问外部类的实例成员变量
//System.out.println("str1 in outer: " + StaticInnerClass.this.str1);
System.out.println("str2 in outer: " + str2);
//静态内部类的实例方法也不能访问外部类的实例成员方法
//method3();
method4();
}
public static void method2(){
System.out.println("static method2 in inner");
//静态内部类的静态方法也不能访问外部类的实例成员变量
//System.out.println("str1 in outer: " + StaticInnerClass.this.str1);
System.out.println("str2 in outer: " + str2);
//静态内部类的静态方法也不能访问外部类的实例成员变量
//method3();
method4();
}
}
}