publicclassOuterClassTest{publicstaticvoidmain(String[] args){//创建Person的静态成员内部类的实例Person.Dog dog =newPerson.Dog();//创建Person的非静态成员内部类实例Person person =newPerson();Person.Bird bird = person.newBird();bird.eat();bird.show("秃鹫");bird.show1();}}classPerson{//外部类String name ="edison";int age =1;//静态内部类-只供人类使用staticclassDog{publicvoideat(){System.out.println("狗改不了吃粑粑");}}//非静态成员内部类classBird{String name ="猫头鹰";publicvoideat(){System.out.println("鸟吃虫子");}publicvoidshow(String name){System.out.println("age = "+ age);//省略了Person.thisSystem.out.println("name = "+ name);//形参nameSystem.out.println("name = "+this.name);//调用当前对象的name属性System.out.println("name = "+Person.this.name);//调用Person.name}publicvoidshow1(){eat();Person.this.eat();//外部类的eat}}publicvoideat(){System.out.println("人吃肉");}publicvoidmethod(){classInnerClass1{}}publicPerson(){classInnerClass1{}}}
成员内部类的理解
从类的角度看
内部类可以声明属性,方法,构造器,代码块,内部类等结构
此内部类可以声明父类,可以实现接口
可以使用final修饰
可以使用abstract修饰
从外部类的成员角度看
在内部可以调用外部类的结构,如属性、方法等
除了使用public、缺省权限修饰外,还可以使用private,protected修饰
可以使用static修饰
如何创建成员内部类的实例
//匿名内部类使用packagecom.lotus.java;publicclassOuterClassTest2{publicstaticvoidmain(String[] args){//①提供了接口匿名实现类的对象A a =newA(){@Overridepublicvoidmethod(){System.out.println("匿名实现类重写的方法method()");}};a.method();//②提供了接口匿名实现类的匿名对象newA(){@Overridepublicvoidmethod(){System.out.println("匿名实现类重写的方法method()");}}.method();//③SubB s1 =newSubB();s1.method1();//④提供了继承于抽象类的匿名子类的对象B b =newB(){@Overridepublicvoidmethod1(){System.out.println("继承抽象类的子类调用的方法");}};b.method1();//⑤提供了继承于抽象类的匿名子类newB(){@Overridepublicvoidmethod1(){System.out.println("继承抽象类的子类调用的方法");}}.method1();//⑥提供了一个继承于C的子类的对象C c =newC(){};c.method2();//⑦提供了一个继承于C的子类的对象,重写method2方法C c1 =newC(){@Overridepublicvoidmethod2(){System.out.println("C子类");}};c1.method2();}}interfaceA{publicvoidmethod();}classSubAimplementsA{@Overridepublicvoidmethod(){System.out.println("SubA");}}abstractclassB{publicabstractvoidmethod1();}classSubBextendsB{@Overridepublicvoidmethod1(){System.out.println("SubB");}}classC{publicvoidmethod2(){System.out.println("C");}}