JAVA内部类理解

public class A{
    ...
    private class B{
        //这就是一个内部类,在类A的里面又定义一个类B,则这个B就是一个内部类
    }
    ...
}

有下列几种内部类
成员内部类,局部内部类,匿名内部类,静态内部类

·什么是成员内部类?
上面的例子的B就是一个成员内部类,因为它是直接定义在一个类的内部,不是定义在类A的方法中的类,此时类A也叫类B的外部类。成员内部类(即B)可以无条件访问外部类(即A)的所有成员属性和成员方法(包括private成员和静态成员)
对于成员内部类的修饰可以用public, protected,private

·什么是局部内部类?

public class A{
    ...
    public void fun(){
        ...
        class B{
            //这是一个局部内部类,定义在A的方法里面的类
        }
        ...
    }
    ...
}

局部内部类不能有public, protected,private等修饰,因为局部内部类就像是方法里面的一个局部变量一样

·什么是匿名内部类?
那么什么是匿名类?

格式:new 父类(){子类内容};
这个父类是子类需要继承或者实现的外部的类或者是接口,new出来的直接是一个对象。

匿名类其实就是某一个类的子类。比较下面两个程序段

class A{
    //....
}

class B extends A{
    //...
}

class C{
    public static void main(String[] args){
        B b = new B();
    }
}
class A{
    //....
}

class C{
    public static void main(String[] args){
        A a = new A(){
            //...
        };
    }
}

解释一下这两个程序段
第一个很常规,B继承A,并在main中生成一个B的对象。
第二个有点不一样,乍一看就是利用类A,new了一个对象a啊,实际上,这里的a有点不一样,这里的a实际上是类A的子类(这里A的子类的名称java给隐藏了,所以叫匿名)new出来的对象,然后使其转为上转型对象(不知道上转型对象可以网上搜下,应该比较好懂)。所以,这里的a并不简单,那么和第一段程序有什么关系呢,第一段是B继承A然后可以重写一些方法,然后生成B的对象,进行一些操作。再看看第二段,如果我们直接在main里面的new A(){}的大括号里面重写A方法,然后生成一个A的子类的对象,然后进行操作是不是达到了第一段一样的目的,而且还不用写那么多。当然匿名类还有很多其它用途,读者可以网上搜搜,这里主要为理解什么是匿名类对主。
匿名类解释完了,那么什么是匿名内部类呢,这就很简单了,在一个类的内部使用匿名类就是匿名内部类,然而使用匿名类时必然是在某个类中直接用匿名类创建对象,因此匿名类就是一个内部类

·什么是静态内部类
静态内部类也是定义在另一个类里面的类,只不过在类的前面多了一个关键字static。它和类的静态成员属性有点类似,有兴趣可以了解一下静态成员。

如有错请及时留言

你可能感兴趣的:(JAVA内部类理解)