Java基础:内部类

内部类的定义

内部类是指将一个类定义在另一个类的里面,对里面那个类就称为内部类

内部类的访问特点

  • 内部类可以直接访问外部类中的成员,包括私有成员。
  • 而外部类要访问内部类中的成员必须要建立内部类的对象

普通内部类

1
2
3
4
5
6
7
8
9
10
11
12
public class Outer {
int x = 6;

public class Inner {
int x = 5;

public void method(){
int x = 3;
System.out.println(x);
}
}
}

当内部类定义在外部类的成员位置上,并且为非私有,在其他外部类中想创建 Outer 的内部类 Inner 的对象时,则需 外部类名.内部类: Outer.Inner inner = new Outer().new Inner(); 不能直接 Inner inner = new Inner(); 因为可能其他的类中也有名为 Inner 的内部类,所以需要标明是哪个类的内部类才行。

Innermethod() 的打印语句,默认输出的是方法体内的局部变量,也就是3,访问 Inner 类中的成员变量可以写 this.x,访问 Outer 类中的成员变量可以写 Outer.this.x

内部类定义在局部时:

  • 不可以被成员修饰符修饰
  • 可以直接访问外部类中的成员,因为还持有外部类中的引用。
    但是不可以访问它所在的局部中的变量。只能访问被final修饰的局部变量。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    class Outer
    {
    int x = 3;

    void method(final int a)
    {
    final int y = 4;
    class Inner
    {
    void function()
    {
    System.out.println(y);
    }
    }

    new Inner().function();

    }
    }

静态内部类

当内部类在成员位置上,就可以被成员修饰符所修饰。

比如:

  • private:将内部类在外部类中进行封装,禁止其他类访问。
  • static:内部类就具备了静态的特性。
1
2
3
4
5
6
7
8
9
10
11
12
public class Outer {
int x = 6;

public static class Inner {
int x = 5;

public void method(){
int x = 3;
System.out.println(x);
}
}
}
  • 当内部类被 static 修饰后,只能直接访问外部类中的 > static ,出现了访问局限。
  • 在外部其他类中,如何直接访问 static 内部类的非静态成员呢?
    new Outer.Inner().method();
  • 在外部其他类中,如何直接访问 static 内部类的静态成员呢?
    Outer.Inner.method();
  • 当内部类中定义了静态成员,该内部类必须也是静态的。
  • 当外部类中的静态方法访问内部类时,内部类也必须是静态的。

匿名内部类

匿名内部类其实就是内部类的简写格式。

1
2
3
4
5
6
7
8
9
10
11
12
abstract class AbsDemo {
abstract void show();
}


class Outer {
new AbsDemo(){
public void show(){
System.out.println("show..")
}
}
}

  • 定义匿名内部类的前提:内部类必须继承一个类或实现一个接口
  • 匿名内部类中定义的方法最好不要超过3个,不然会影响阅读。