如果在一个类中再定义一个类,那么这个在类中被定义的类就叫做内部类。
Java的内部类分为四种
- 成员内部类
- 局部内部类
- 匿名内部类
- 静态内部类
成员内部类
package blog.c;
public class Dome1 {
Dome2 d = new Dome2();// 在外部类实例化内部类对象引用
public void out() {// 外部方法中调用内部类方法
d.inDome();
}
class Dome2 {// 成员内部类
Dome2() {// 成员内部类里的构造方法
}
public void inDome() {// 内部类成员方法
System.out.println("成员内部里的成员方法");
}
int y = 0;// 内部类成员变量
}
public Dome2 doit() {
y = 10;// 会报错,外部类不可直接访问内部类成员变量
d.y = 10;
return new Dome2();
}
public static void main(String[] args) {
// 两种调用内部类的方法
Dome1 o = new Dome1();
o.out();
Dome1.Dome2 m = o.new Dome2();
m.inDome();
}
}
内部类的实例一定要绑定在外部类的实例上,内部类的初始化方式与其他类的初始化方式相同,都是使用new关键字。
外部类创建内部类实例与其他类创建对象引用时相同,内部类可以访问他的外部类成员,但内部类成员只可以在内部类范围之内可知,但是可以使用内部类对象引用调用成员变量。
局部内部类
package blog.c;
public class Dome1 {
public Usecase doit(final String x) {
class ininDome implements Usecase {// 局部内部类
public ininDome(String s) {
s = x;
System.out.println(s);
}
}
return new ininDome("doit");
}
public static void main(String[] args) {
Dome1 d = new Dome1();
d.doit("局部内部类");
}
}
interface Usecase {// 定义一个接口
}
内部类不仅可以在类中定义,也可以在类的局部位置定义,比如在类的方法中定义。
匿名内部类
package blog.c;
public class Dome1 {
public Dome2 doit() {
return new Dome2() {// 匿名内部类
private int i = 10;
public int Exp() {
return i;
}
};
}
public static void main(String[] args) {
}
}
interface Dome2 {// 定义一个接口
}
在return语句中编写返回值为一个匿名内部类,匿名内部类没有类名,所以实现代码都需要在大括号里进行编写。
匿名内部类编译以后,会产生以“外部类名$序号”为名的.class文件
静态内部类
package blog.c;
public class Dome1 {
int x = 10;
static int y = 10;
static class inDome2 {// 静态内部类
public void doit() {
System.out.println(x);// 报错,静态内部类不可以直接调用外部类的非静态成员变量
System.out.println(y);// 静态内部类调用外部类的成员变量,必须是静态的
}
public static void main(String args[]) {
System.out.println("静态内部类里的main方法");
}
}
}
在内部类前添加修饰符static,这个内部类就变成静态内部类了。一个静态内部类可以声明static成员,但是在非静态内部类中不可以声明静态成员。在静态内部类里可以创建main方法。
注意
- 如果创建静态内部类的对象,不需要其外部类的对象。
- 不能从静态内部类的对象中访问非静态外部类的对象。