Java深入学习19:内部类分析
如下
public class OutClass { public String outParam = "outParam"; public String print(){ System.out.println("this OutClass print method"); return "OutClass.print"; } public String print(String param){ System.out.println("this OutClass print(String param)" + param); return param; } public void print2(){ System.out.println("this OutClass print method for MemberInnerClass"); } //1-成员内部类 //成员内部类:作为类的成员而存在的,其定义位于类的内部,可以类比为成员变量来理解 //类定义的约束,成员内部类的类定义没有任何约束,不仅可以将内部类声明为public、private的,甚至可以将其声明为一个abstract抽象类和interface接口,以及继承外部类也是允许的 //内部属性和方法定义约束: //(1)不能使用static来修饰任何成员内部类中的属性和方法,但可以使用private、final等其余任意修饰符 //(2)可以用static final来修饰成员 //(3)可以允许与外部类字段和方法重名 //访问上的约束 //(1)成员内部类也存在this指针,但是这个指针指向的是自己的引用,如果想访问外部类,需要使用 外部类名.this这个指针 //(2)可以通过 外部类名.静态字段来访问外部类的静态属性或方法字段 class MemberInnerClass{ //static String sParam = "";//inner class can not have static declaration static final String sfParam = "";//static final variable is allowed public void print(){ OutClass.this.print(outParam); } } //2-局部内部类 //局部内部类位于外部类成员方法的内部,可以类比局部变量.局部内部类和成员内部类十分类似 //相关约束 //(1)其类上不允许有任何修饰符,但是可以使用abstract将类声明为抽象类 //(2)不允许将局部内部类声明为接口 //(3)不允许使用static来声明成员变量和方法 //(4)可以将局部内部类声明在静态方法中 //(5)任意两个方法中的局部内部类可以重名 //使用:既然是局部内部类,就只能在声明类的方法处来使用.同样地,我们依然可以无条件访问内部类中定义的私有属性 public void method1(){ class LocalInnerClass{ //static String sParam = "";//inner class can not have static declaration static final String sfParam = "";//static final variable is allowed private String localInnerClassVariable = "localInnerClassVariable"; private void print(){ System.out.println("method1 |LocalInnerClass"); } } LocalInnerClass localInnerClass = new LocalInnerClass(); localInnerClass.print(); System.out.println("LocalInnerClass localInnerClassVariable"); } //3-匿名内部类 //匿名内部类没有类的声明,会隐式地继承一个类或实现一个接口(这个很重要) //这里的Demo可以换成任意一个类或者接口,你会发现这个类没有名字,所以被叫做匿名内部类如果Demo是一个普通类,则匿名内部类相当于这个类的子类;如果Demo是一个接口或者抽象类,则这个匿名内部类相当于接口或抽象类的实现 //约束:想要理解匿名内部类的约束,就需要将整个匿名内部类不要当成一块程序逻辑来看,而应该当成一个对象来处理,整块匿名内部类完全可以当成一个对象,可以调用对象的方法、属性等等 //不能使用static来修饰方法和属性,但是可以有static final的属性 //可以使用this指针来访问本身定义的变量和继承得到的变量,也可以使用 外部类名.this //指针来访问外部类中的所有属性 //无法在类上进行任何修饰,因为没有class定义符和类名 //其中定义的私有字段对外是完全可见的 public void method2(){ String printResult = new OutClass() { @Override public String print() { System.out.println("this method2 OutClass print method"); return "method2 OutClass print"; } }.print(); System.out.println("method2 printResult: " + printResult); new InterfaceA(){ @Override public void print() { System.out.println("InterfaceA " + OutClass.this.print()); } }.print(); } //4-静态内部类 //静态内部类相当于static修饰的成员内部类,可以当作静态变量来理解 //约束这里的约束就和之前的有很大不同了,如下: //(1)可以使用任意的修饰符来修饰类、方法和属性 //(2)可以访问外部类的静态方法和属性 //(3)没错,广义上,静态内部类根本没有约束 static class StaticInnerClass{ public static String a = "a"; static{ System.out.println("StaticInnerClass static block"); } public static void print(){ System.out.println("StaticInnerClass print"); } } public MemberInnerClass getInstance(){ return new MemberInnerClass(); } public static void main(String[] args) { OutClass oc = new OutClass(); System.out.println("-------------------1-----------------"); oc.getInstance().print(); System.out.println("-------------------2-----------------"); oc.method1(); System.out.println("-------------------3-----------------"); oc.method2(); System.out.println("-------------------4-----------------"); StaticInnerClass.print(); } } interface InterfaceA{ void print(); }
日志如下
-------------------1----------------- this OutClass print(String param)outParam -------------------2----------------- method1 |LocalInnerClass LocalInnerClass localInnerClassVariable -------------------3----------------- this method2 OutClass print method method2 printResult: method2 OutClass print this OutClass print method InterfaceA OutClass.print -------------------4----------------- StaticInnerClass static block StaticInnerClass print
END