在类中也可以声明类,而且这个类还是用private或者protected修饰,因为这个类是另一个类的内部成员。
public class Outer {
class Inner{
}
}
内部类就像一个普通的类成员一样,可以用public/private/protected,static,final,abstract(内部类不是一个方法,所以可以用abstract修饰)来修饰。abstract定义的内部抽象类。
在类中还可以声明接口,因为某种程度而言,接口只是一个方法全部都是抽象方法,变量都是全局常量的抽象类。
public class Outer {
interface Inner{
}
}
当内部类用一些修饰符来修饰的时候,它也必须要满足该修饰符的一些使用条件,比如当一个内部类用static修饰时,它无法直接访问外面的非static属性和方法,需要通过对象访问:
public class Outer {
int a;
static class Inner{
public void test(){
System.out.println(new Outer().a);
}
}
}
除了是在类的内部之外,内部类和普通类的差别不大。
public class Demo{
public static void main(String[] args) {
new Outer.Inner().test();
}
}
内部类在编译的过程中也会生成一个class文件(Outer$Inner.class)。内部类需要外部类来调用,因为它本质也是外部类的一个成员。
内部抽象类:
public class Outer {
int a;
abstract class Inner{
public abstract void test();
}
}
public class Demo{
public static void main(String[] args) {
Outer.Inner test = new Outer().new Inner() {
@Override
public void test() {
System.out.println("test");
}
};
test.test();//test
}
}
在学习抽象类的时候我们知道抽象类是不能直接创建实例的,需要通过子类来创建实例,上例也是一样的,只不过这个子类是匿名的,不能够引用而已。
内部接口:
public class Outer {
interface Inner{
void test();
}
}
public class Demo{
public static void main(String[] args) {
Outer.Inner inner = new Outer.Inner() {
@Override
public void test() {
System.out.println("test");
}
};
inner.test();//test
}
}
只需要把内部类当成是外部类的一个成员,通过外部类调用,按照类或抽象类、接口的正常使用方法使用就可以了,不需要想的太过复杂。