内部类主要有以下几类:成员内部类、局部内部类、静态内部类、匿名内部类
成员内部类:
即在一个类中直接定义的内部类, 成员内部类与普通的成员没什么区别,可以与普通成员一样进行修饰和限制。成员内部类不能含有static的变量和方法,但可以访问外部类的所有成员
public class Outer {
private static int i = 100;
private int j = 10;
public static void outer_f1() {}
public void outer_f2() {}
class Inner {
int j = 100;
void inner_f1() {
outer_f1();
outer_f2();
}
}
}
局部内部类:
在方法中定义的内部类称为局部内部类。与局部变量类似,局部内部类不能有访问说明符,因为它不是外围类的一部分,但是它可以访问当前代码块内的常量,和此外围类所有的成员。
public class Outer {
private int s = 100;
public void f(final int k) {
final int s = 200;
class Inner {
int s = 300;// 可以定义与外部类同名的变量
Inner(int k) {
inner_f(k);
}
int inner_i = 100;
void inner_f(int k) {
}
}
new Inner(k);
}
public static void main(String[] args) {
// 访问局部内部类必须先有外部类对象
Outer out = new Outer();
out.f(3);
}
}
静态内部类:
如果你不需要内部类对象与其外围类对象之间有联系,那你可以将内部类声明为static。这通常称为嵌套类(nested class)。想要理解static应用于内部类时的含义,你就必须记住,普通的内部类对象隐含地保存了一个引用,指向创建它的外围类对象。然而,当内部类是static的时,就不是这样了。要创建嵌套类的对象,并不需要其外围类的对象。不能从嵌套类的对象中访问非静态的外围类对象。
生成一个静态内部类不需要外部类成员:这是静态内部类和成员内部类的区别。静态内部类的对象可以直接生成:
Outer.Inner in = new Outer.Inner();
生成一个静态内部类不需要外部类成员:这是静态内部类和成员内部类的区别。静态内部类的对象可以直接生成:Outer.Inner in = new Outer.Inner();
匿名内部类:
匿名内部类也就是没有名字的内部类正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口。
abstract class Person {
public abstract void eat();
}
public class Demo {
public static void main(String[] args) {
Person p = new Person() {
public void eat() {
System.out.println("eat something");
}
};
p.eat();
}
}