/* 内部类的访问规则: 1、内部类可以直接访问外部类的成员,包括私有成员,之所以可以直接访问外部类成员,是因为内部类中持有一个外部类的引用,格式:外部类名称.this 2、外部类要访问内部类,必须要建立内部类对象 一般我们都将内部类私有化进行封装起来。 访问格式: 当内部类定义在外部类的成员位置时,而且是非私有,可以再外部其他类中直接建立内部类对象。 格式: 外部类名.内部类名 变量名 = 外部类对象.内部类对象; Outer.Inner in=new Outer().new Inner(); 2、当内部类在成员变量位置上时可以被成员变量修饰符修饰,比如,private:将内部类在外部类中进行封装,static:内部类就具有static特性。 当内部类被static修饰后,只能直接访问外部类中的静态成员,出现访问局限, 在外部其他类中,如何直接访问static内部类的非静态成员呢? new Outer.Inner().funtion(); 在外部其他类中,如何直接访问static内部类的静态成员呢? Outer.Inner.function(); 注意:当内部类中定义了静态成员,该内部类必须是静态类。 当外部静态方法访问内部类时,内部类必须为惊天。 */ class Outer { private int x = 3; class Inner { int x=4; void function() { int x=7; System.out.println(x); //输出7 System.out.println(this.x); //输出4 System.out.println(Outer.this.x); //输出3 //上面定义的三个变量x,是种特殊情况,一般如果没有this类的指定修饰,直接输出x。采取的就近原则 <span style="white-space:pre"> </span> //注释int x=7,那么println(x)和println(this.x)是一样的 //注释int x=4,那么println(this.x)是错误的,因为内部类没有成员x } } static class Inner2 { static int y=10; void function() { System.out.println("静态内部类。"); } } void method() //外部类成员访问内部类 { Inner in=new Inner(); in.function(); } } class InnerDemo { public static void main(String[] args) { Outer outer=new Outer(); outer.method(); //访问外部类中成员 Outer.Inner in=new Outer().new Inner(); //创建内部类对象 in.function(); System.out.println(Outer.Inner2.y); //访问静态内部类中的静态成员 new Outer.Inner2().function(); //访问静态类中的非静态成员. } }