标签:
当A类中的内容要被B类直接访问,而A类还需要创建B的对象,访问B的内容时,将B称之为内部类(内置类、嵌套类)。
访问方式:
内部类可以直接访问外部类中的所有成员,包含私有的;而外部类要想访问内部类中的成员,必须创建内部类的对象。
class Outer//外部类{ private int num = 4; public calss Inner//内部类{ void show(){ System.out.println("num=num"); } } void method(){ /*Outer.*/Inner in = new /*Outer.*/Inner(); in.show(); } } class InnerClassDemo{ public static void main(String[] args){ Outer out = new Outer(): out.method(); } } public static void main(String[] args){ Outer out = new Outer(); out.method(); //测试情况一:直接访问Outer中的Inner内部类的非静态成员 //创建内部类的对象就可以了,内部类作为成员,应该先有外部类对象,再有内部类对象。 Outer.Inner in = new Outer().new Inner(); in.show(); //测试情况二:对静态内部类中的非静态成员进行调用 //因为内部类是静态,所以不需要创建Outer的对象,直接创建内部类对象就可以了。 Outer.Inner2 in = new Outer().new Inner2(); in.show2(); }
因为内部类其实持有了外部类的引用, 外部类.this,对于静态内部类不持有外部类.this 而是直接使用 外部类名
匿名内部类,其实就是一个带有内容的子类对象。
class InnerClassDemo4{ public static void main(String[] args){ Outer out = new Outer(); AbsDemo a = out.getObject();//多态 a.show(); <span style="white-space:pre"> </span> } }
现在不想创建具体的子类型,但还想创建AbsDemo的子类对象,如何实现?
直接使用父类就可以了,可是在该例中是抽象类,怎么new对象?→重写抽象方法。
new AbsDemo(){ //重写抽象的show方法 void show(){ System.out.println("num="+num); <span style="white-space:pre"> </span> } }这就是传说中的一个AbsDemo的子类对象,只不过这是一个带着内容的子类休想。
格式:new 父类or接口(){子类的内容}
其实尼匿名内部类就是内部类的简化形式;注意匿名内部类有前提,必须要继承父类或者实现接口。
如果内部类有静态成员,该如何访问:
既然静态内部类已经随外部类加载,而且静态成员随着类的加载而加载,就不需要对象,直接用类名调用即可。
Outer.Inner2.staticShow();
static void show1(){}//非静态内部类中不允许定义静态成员;仅允许在非静态内部类中定义静态常量(static final)
如果想要在内部类中定义静态成员,必须内部类也要被静态修饰。
标签:
原文地址:http://blog.csdn.net/mydistance/article/details/46381317