内部类
内部类,就是在一个类里面再定义一个类,可以分为成员内部类、局部内部类、匿名内部类、嵌套内部类(static修饰)。
内部类是编译时的概念,编译成功后会出先两个不同的类,所以内部类的成员变量、成员方法可以是相同的。
成员内部类:
成员内部类就是定义在内的里面,类似于成员方法,它可以访问外部类的所有属性、方法。
成员内部类自己的方法、字段不可一使用static修饰。因为用static修饰的方法或字段属于自身类的,而成员内部类只有创建了外部类的对象后才能创建。
1 //外部类
2 public class Outer {
3 public static void main(String[] args) {
4 //创建一个外部类对象
5 Outer outer = new Outer();
6 //创建一个内部类对象
7 Outer.Inner inner = outer.new Inner();
8 }
9
10 //内部类
11 class Inner{
12 //static String name;//不能定义静态成员变量
13 //内部类的构造器
14 Inner() {
15 System.out.println("我是内部类");
16 }
17 }
18 }
局部内部类:
局部内部类就是定义在方法或者代码块中的类,他和和成员内部类一样,但是它的作用域只在定义的方法或代码块中,超出了该范围则不能使用。
1 //外部类
2 public class Outer {
3 public static void main(String[] args) {
4 //在代码块中定义一个内部类
5 {
6 class Inner {
7 int a = 1;
8 //内部类的构造器
9 Inner() {
10 System.out.println("我是内部类");
11 }
12 }
13 //创建内部类对象
14 Inner in = new Inner();
15 }
16 //Inner in = new Inner();//错误,超出作用域范围
17 }
18 }
匿名内部类:
匿名内部类其实是创建了一个类的对象,而该对象没有名字,我们有时候只需要使用一次某个类的对象时就可以使用匿名内部类。
注意:该类是需要定义的,如果不定义会报错。
//外部类
public class Outer {
public static void main(String[] args) {
//创建一个匿名对象类并获取它的成员变量
System.out.println(new Inner() {}.a );
}
}
//定义一个类
class Inner {
int a = 1;
}
嵌套内部类:
使用了static修饰符修饰的成员内部类,嵌套内部类和成员内部类的不同在于,嵌套内部类可以有静态属性和方法,而成员内部类不能有。
嵌套内部类可以直接使用外部类名调用:Outer.Inner不需要创建外部类对象,也不需要创建内部类对象。
1 //外部类
2 public class Outer {
3 public static void main(String[] args) {
4 //直接使用类名访问
5 int a = Outer.Inner.a;
6 }
7 static class Inner {
8 static int a = 1;//可以有静态成员变量
9
10 //内部类的构造器
11 Inner() {
12 System.out.println("我是内部类");
13 }
14 }
15 }