一、成员内部类
- 成员内部类是最普通的内部类
- 内部类可以无限制地访问外部类的成员,无论是私有还是静态成员
- 外部类中想要访问内部类的成员,必须先创建一个内部类的对象,再通过该对象来访问
- 成员内部类是依附于外部类而存在的,如果想创建内部类的对象,必须基于一个外部类对象
class FatherClass {
}
class OuterClass {
private int outer1 = 1;
public static int outer2 = 2;
void getInner() {
InnerClass innerClass = new InnerClass();
System.out.println(innerClass.inner);
}
class InnerClass extends FatherClass{
public void print() {
System.out.println(outer1);
System.out.println(outer2);
}
}
}
OuterClass outerClass = new OuterClass();
OuterClass.InnerClass innerClass = outerClass.new InnerClass();
innerClass.print();
二、局部内部类
- 嵌套在方法或作用域内,与成员内部类的区别在于它的访问权限仅限于方法内或者该作用域内
class FatherClass {
}
class OuterClass {
int outer = 0;
public void getInner() {
class InnerClass extends FatherClass{
void print() {
System.out.println(outer);
}
}
InnerClass inner = new InnerClass();
inner.print();
}
}
OuterClass outerClass = new OuterClass();
outerClass.getInner();
三、匿名内部类
- 匿名内部类没有访问修饰符、没有构造方法
- new匿名内部类,这个类首先是要存在的
- 一般匿名内部类用于接口回调,不需要增加额外的方法,只是对继承方法的实现或是重写
interface InnerClass {
int getNumber();
}
class OuterClass {
public InnerClass getInnerClass(int num) {
return new InnerClass() {
int number = num + 1;
public int getNumber() {
return number;
}
};
}
}
OuterClass outerClass = new OuterClass();
InnerClass innerClass = outerClass.getInnerClass(1);
System.out.println(innerClass.getNumber());
四、静态内部类
- 不需要依赖于外部类,这一点与类的静态成员属性类似
- 不能使用外部类的非static成员变量或方法,因为静态内部类对象的创建不依赖于外部类对象,而外部类的非static成员必须依赖于外部类对象,如果允许访问会产生矛盾
class OuterClass {
static int outer = 0;
static class InnerClass {
void print() {
System.out.println(outer);
}
}
}
OuterClass.InnerClass innerClass = new OuterClass.InnerClass();
innerClass.print();