跳至主要內容

Java内部类

小熊同学大约 2 分钟

1、静态内部类与非静态内部类有什么区别?

  • 静态内部类可以有静态成员(方法,属性),而非静态内部类则不能有静态成员(方法,属性)。
  • 静态内部类只能够访问外部类的静态成员和静态方法,而非静态内部类则可以访问外部类的所有成员(方法,属性)。
  • 实例化静态内部类与非静态内部类的方式不同
  • 调用内部静态类的方法或静态变量,可以通过类名直接调用

2、静态内部类如何定义?

定义在类内部的静态类,就是静态内部类。

public class Out{
    public static int a;
    private int b;
    
    public static class Inner{
        public void print(){
            System.out.println(a);
        }
    }
}
  1. 静态内部类可以访问外部类所有的静态变量和方法,即使是 private 的也一样。
  2. 静态内部类和一般类一致,可以定义静态变量、方法,构造方法等。
  3. 其它类使用静态内部类需要使用“外部类.静态内部类”方式,如下所示:Out.Inner inner = new Out.Inner();inner.print();
  4. Java集合类HashMap内部就有一个静态内部类Entry。Entry是HashMap存放元素的抽象,HashMap 内部维护 Entry 数组用了存放元
    素,但是 Entry 对使用者是透明的。像这种和外部类关系密切的,且不依赖外部类实例的,都可以使用静态内部类。

3、什么是成员内部类?

定义在类内部的非静态类,就是成员内部类。成员内部类不能定义静态方法和变量(final修饰的除外)。这是因为成员内部类是非静态的,类初始化的时候先初始化静态成员,如果允许成员内部类定义静态变量,那么成员内部类的静态变量初始化顺序是有歧义的。

public class Out{
    public static int a;
    private int b;
    
    public class Inner{
        public void print(){
            System.out.println(a);
        }
    }
}

4、Anonymous Inner Class(匿名内部类)是否可以继承其它类?是否可以实现接口?

可以继承其他类或实现其他接口,在 Swing 编程和 Android 开发中常用此方式来实现事件监听和回调。

5、内部类可以引用它的包含类(外部类)的成员吗?有没有什么限制?

一个内部类对象可以访问创建它的外部类对象的成员,包括私有成员。

6、是否可以从一个静态(static)方法内部发出对非静态(non-static)方法的调用?

不可以, 静态方法只能访问静态成员,因为非静态方法的调用要先创建对象, 在调用静态方法时可能对象并没有被初始化。