内部类
成员内部类
成员内部类是最为普通的内部类,定义于另一个类的内部,形如下面的形式:
class Outer {
private int a = 0;
class Inner {
public void show() {
System.out.println(a);
}
}
}
Inner像是Outer的成员。成员内部类可以无条件的访问外部类的所有属性。
创建成员内部类的方式
成员内部类是依赖于外部类存在的,也就是说,如果要创建成员内部类的对象,前提是必须存在一个外部类对象。
Outer out = new Outer();
Outer.Inner in = out.new Inner();
Outer.Inner inn = new Outer().new Inner();
内部类可以拥有四种访问权限。
如果成员内部类Inner用private修饰,则只能在外部类的内部访问;用public修饰,任何地方都能访问;用protected修饰,则只能在同一个包下或者继承外部类的情况下访问;如果是默认访问权限,则只能在同一个包下访问。
局部内部类
局部内部类是定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问权限仅限于方法内或者改作用域内。
class Outer {
private int a = 0;
public void show() {
class Inner {
private void show1() {
System.out.println(a);
}
}
Inner in = new Inner();
in.show1();
}
}
局部内部类就像是方法中的局部变量一样,是不能有public protected private static 修饰符的
匿名内部类
匿名内部是使用最多的内部类。
使用匿名内部类能够在实现父类或者接口中的方法情况下同时产生一个相应的对象,但是前提是这个父类或者接口必须存在才可以这样使用。
public static void main(String[] args) {
new Outer() {
@Override
void method() {
System.out.println("method");
}
}.method();
}
匿名内部类是唯一一种没有构造器的类。
一般来说,匿名内部类用于继承其他类或是实现接口,并不需要增加额外的方法,只是对继承方法的实现或者是重写。
静态内部类
静态内部类也是定义在另一个类里面的类,只不过在类的前面多了一个关键字static。静态内部类是不需要依赖于外部类的,这点和类的静态成员属性有点相似,而且它不能使用外部类的非静态成员方法或者变量。因为如果在没有外部类的对象的情况下,可以创建静态内部类的对象,如果允许访问外部类的非静态成员就会发生矛盾,因为外部类的非静态成员必须依附于具体的对象。
class Outer1 {
int a = 0;
static int aa = 1;
static class Inner{
private void show() {
// System.out.println(a); 不能访问外部类的非静态成员
System.out.println(aa);
}
}
}
静态内部类的创建方式
Outer1.Inner in = new Outer1.Inner();