public class MyTest {
private String str ="";
private static String static_str ="";
public static void main(String[] args) {
MyTest.Inner s = new MyTest().new Inner();
s.hello();
MyTest.StaticInner t = new MyTest.StaticInner();
t.hello();
MyTest.StaticInner.static_str="";
}
public class Inner{
void hello(){
System.out.println(str);
System.out.println(static_str);
}
}
public static class StaticInner{
static String static_str="";
void hello(){
MyTest test = new MyTest();
System.out.println(test.str);
System.out.println(static_str);
}
}
}
外部类访问内部类:
外部类访问普通内部类的非静态成员(普通内部类不能定义静态属性或静态方法): MyTest.Student s = new MyTest().new Student(); s.hello();
外部类访问静态内部类的非静态属性: MyTest.Teacher t = new MyTest.Teacher(); t.hello();
外部类访问静态内部类的静态属性: MyTest.Teacher.School_Name;
内部类访问外部内:
所有内部类可以直接使用外部类的静态属性
普通内部类可以直接使用外部类的非静态属性
静态内部类必须通过外部类的对象访问外部类的非静态属性:MyTest test = new MyTest(); test.hello();
普通内部类里面不能定义各种静态的成员(包括静态变量、静态方法、静态代码块和静态内部类),而静态内部类中则可以。原因:普通内部类必须通过外部类的对象来访问,违背了静态成员可以直接通过类名访问的规则。
初始化方式不同:
静态内部类初始化 MyTest.Teacher t = new MyTest.Teacher();
非静态内部类初始化 MyTest.Student s = new MyTest().new Student();
注意:
静态内部类和普通内部类都可以定义非静态的属性或方法,都以用new实例化出静态内部类和普通内部类的对象。原因:用static修饰内部类,只是说明该类属于外部类本身,而不是属于外部类的某个对象。