匿名内部类的常规内部类:
1.内部类里不可以有static关键字的修饰。
2.内部类里可以直接调用外部类的实例方法或者是实例变量(无论private还是public的)无需创建对象在调用这些。
3.在外部类里可以在实例方法里直接创建内部类的对象。
4.编译下面代码会产生两个文件:RoutineInnerClass.class和RoutineInnerClass$InnerClass.class。
package InnerClass;
/**
* Created by Mr.Meng on 2016/7/3.
*/
public class RoutineInnerClass {
private String outVariable= "out";//实例变量
private static String staticString="staticString";//类变量
//有两种外部类静态方法获取非静态内部类的方法:
public static void staticMethod(){//类方法也就是静态方法,它调用了内部类里对象
// InnerClass staticInnerClass=new InnerClass();错误的
RoutineInnerClass routineInnerClass=new RoutineInnerClass();//创建外部类的对象
InnerClass innerClass=routineInnerClass.makeInnerObject();//调用这个方法得到内部类对象,
InnerClass innerClass1=routineInnerClass.new InnerClass();//外部类的静态方法里无法直接new出一个非静态内部类的对象
//所以用这样的方式 外部类.new 内部类
//现在的内部类相当于外部类的一个全局成员,外部类对象可以获得InnerClass的一个对象,所以用new InnerClass去new一个对象让外部类对象可以调用
// 否则无法直接在静态方法里new内部类的对象
System.out.println("我是内部类的变量,我是外部类的staticMethod:"+innerClass.innerVariable);
System.out.println("im staticMethod");
}
public void outMethod(){
System.out.println("outMethod");
}
private void outMethodPrivate(){
System.out.println("outMethodPrivate");
}
public InnerClass makeInnerObject(){//外部类的实例方法里可以创建内部类的对象
InnerClass innerClass=new InnerClass();
System.out.println("我是外部类的方法,创建了一个内部类的对象:"+innerClass);
return innerClass;
}
//常规内部类可以不用调用外部类的对象,来获取它的非静态方法和变量
class InnerClass{//内部类
private String innerVariable="inner";
public void innerMethod(){
System.out.println("可以直接得到外部类的静态变量"+staticString);//可以直接得到外部类的静态变量
staticMethod();//外部类的静态方法
// RoutineInnerClass routineInnerClass=new RoutineInnerClass();//这是多余的
outMethod();
outMethodPrivate();
System.out.println("内部类里调用了外部的私有变量:"+outVariable);
makeInnerObject();
}
}
public static void main(String[] args) {
RoutineInnerClass OutObject=new RoutineInnerClass();
InnerClass InnerObject=OutObject.new InnerClass();
InnerObject.innerMethod();
}
}
结果如下:
可以直接得到外部类的静态变量staticString
我是外部类的方法,创建了一个内部类的对象:InnerClass.RoutineInnerClass$InnerClass@10b30a7
我是内部类的变量,我是外部类的staticMethod:inner
im staticMethod
outMethod
outMethodPrivate
内部类里调用了外部的私有变量:out
我是外部类的方法,创建了一个内部类的对象:InnerClass.RoutineInnerClass$InnerClass@1a758cb