定义:定义在类里面的类被称为“内部类”。
根据内部类的定义位置分为:
- 成员内部类
- 静态内部类
- 方法内部类
- 匿名内部类
成员内部类:内部类与外部类的成员变量在一级。
public class TestInnerClass {
private String name = "外部类";
public class InnerClass {
private String name = "成员内部类";
public void show() {
System.out.println("我是" + TestInnerClass.this.name);//使用外部类.this.变量名→访问外部类的变量,且不管外部类的修饰符是什么
System.out.println("我是" + name);
}
}
public static void main(String[] args) {
TestInnerClass ic = new TestInnerClass();
System.out.println(ic.name);
ic.new InnerClass().show();//必须使用外部类对象来创建内部类对象
show();//编译出错,外部类无法直接访问内部类的方法及变量
}
}
包含成员内部类的编译效果:
静态内部类:
public class TestInnerClass {
private String name = "外部类";
private static String name2 = "静态外部变量";
public static class InnerClass2 {
public static String name2 = "内部类静态变量";
public void show() {
//静态内部类可以使用外部类对象访问外部类非静态变量
System.out.println("外部类非静态变量:" + new TestInnerClass().name);
//静态内部类可以使用外部类直接访问外部类静态变量
System.out.println("外部静态变量:" + TestInnerClass.name2);
System.out.println("内部类静态变量:" + name2);
//静态内部类可以使用外部类直接调用外部类的静态方法
TestInnerClass.show();
//静态内部类使用外部类对象访问外部类非静态方法
new TestInnerClass().show2();
}
}
public static void show() {
System.out.println("外部类静态方法");
}
public void show2() {
System.out.println("外部类非静态方法");
}
public static void main(String[] args) {
InnerClass2 ic2 = new InnerClass2();//静态内部类可以直接创建
ic2.show();
}
}
方法内部类:内部类定义在外部类的方法中,且只有在外部类的方法中可见、使用,故方法的内部类不能使用访问控制修饰符和static修饰符,可以使用abstract和final修饰。
public class TestInnerClass {
public void show2() {
class MethodInnerClass { //方法内部类
public String name = "方法内部类";
public void show() {
System.out.println(name);
}
}
MethodInnerClass mis = new MethodInnerClass();//创建方法内部类
mis.show();
}
public static void main(String[] args) {
TestInnerClass ic = new TestInnerClass();
ic.show2();
}
}