在类中再定义一个类,则将在类中再定义的那个类称为内部类;

内部类可分为成员内部类、局部内部类、匿名类

1、成员内部类

在内部类中可以随意使用外部类的成员方法以及成员变量,尽管这些类成员被修饰为private;

但内部类的成员只有在内部类的范围之内是可知的,不能被外部类使用

内部类的对象实例化操作必须在外部类

使用this关键字获取内部类与外部类的引用

public class TheSameName{
    private int x;
    private class Inner{
        private int x=9;
        public void doit(int_x){
            x++;  //调用的是形参x
            this.x++;   //调用内部类的变量x
            TheSameName.this.x++;    //调用外部类的变量x
        }
   }
}

2、局部内部类

interface OutInterface2{
}
class OuterClass3{
    public OutInterface2  doit(final String x){
        class InnerClass2 implements OutInterface2{
            InnerClass2(String s){
                s=x;
                System.out.println(s);
            }
        }
        return new InnerClass2("doit");
    }
}

内部类被定义在了doit()方法内部,内部类InnerClass2是doit()方法的一部分,并非OuterClass3类中的一部分,所以在doit()方法的外部不能访问该内部类,但是该内部类可以访问当前代码快的常量以及外部类的所有成员。

3、匿名内部类

匿名类的所有实现代码都需要在大括号之间进行编写

return new A(){
    ...//内部类体
};

 

匿名内部类没有名称,实质上这种内部类的作用就是创建一个实现于OutInterface2接口的匿名类的对象:

class OuterClass4{
    public OutInterface2 doit(){
        return new OutInterface2(){
            private int i=0;
            public int getValue(){
                return i;
            }
        };  //这个分号并不是代表定义内部类结束的标识,而是代表创建OuterInterface2引用表达式的标识
    }
}

4、静态内部类

在内部类前添加修饰符static,这个内部类就变成静态内部类了;

一个静态内部类中可以声明static成员,但是在非静态内部类中不可以声明静态成员;

静态内部类不可以使用外部类的非静态成员;

5、内部类的继承

public class OutputInnerClass extends ClassA.ClassB{ //继承内部类ClassB
    public OutputInnerClass(ClassA a){
        a.super();
    }
}
class ClassA{
    class ClassB{
    }
}

在某个类继承内部类时,必须硬性给予这个类一个带参数的构造方法,并且该构造方法的参数为需要继承内部类的外部类的引用,同时在构造方法中使用a.super()语句,这样才能为继承提供了必要的对象引用。

posted on 2015-08-03 22:01  chamie  阅读(404)  评论(0编辑  收藏  举报