面试 | 什么是内部类?成员内部类、静态内部类、局部内部类和匿名内部类的区别及作用?

1 内部类的概念

内部类是定义在另一个类中的类;下面类B是类A的内部类。即内部类对象引用了实例化该内部对象的外围类对象。

public class A{
    class B {}
}

2 为什么需要内部类?(来自JAVA核心技术)

  • 内部类方法可以访问该类定义所在的作用域中的数据,包括私有数据。
  • 内部类可以对同一个包中的其他类隐藏起来。
  • 当想要定义一个回调函数且不想编写大量代码时,使用匿名内部类比较便捷。

3 内部类的分类

3.1 成员内部类

成员内部类:存在于某个类的内部,与全局属性或者方法同级的内部类就是成员内部类。
成员内部类特点:

  • 成员内部类可以无条件访问外部类的所有成员属性和成员方法(包括静态成员和私有成员)。
  • 成员内部类和外部类的属性和方法名同名时,外部类的属性和方法会隐藏;但可以通过外部类.this.成员变量的方式访问外部类的属性和方法。
  • 外部类必须通过成员内部类的对象来访问内部类的属性和方法。
  • 成员内部类对象会隐式的引用一个外部类对象。(可以解释第一点)
  • 成员内部类可以有public\private\protected以及默认访问权限。

成员内部类实例:

public class Person{
    public void eat(){}
    public class DoWork implements Work{}
}
3.2 局部内部类

局部内部类:是定义在一个方法或者一个作用域里面的类。它与成员内部类的区别在于局部内部类的访问仅在于方法内或者作用域内。
局部内部类的特点:

  • 不能有private、public、protected和static等修饰符,与局部变量类似。
  • 只能在定义局部内部类的方法或者作用域中实例化;
  • 局部内部类的对象不能使用该内部类所在方法或者作用域的非final局部变量(为什么?);

局部内部类实例:

public class Person{
    public void eat(){
        public class DoWork implements Work{}
    }
}
3.3 匿名内部类

匿名内部类:不定义类的名字,在使用的地方直接定义对象。
匿名内部类的特点:

  • 唯一一种没有构造器的类;匿名内部类在编译时,编译器会自动起名xxx$1.class;
  • 匿名内部类不能存在任何静态的变量、方法等;
  • 匿名内部类是局部内部类的特例;
  • 大部分匿名内部类用于接口返回;

匿名内部类实例:

public class Person{
    public DoWork doSomething(){
        return new DoWork(){
            public void do(){}
        }
    }
}
3.4 静态内部类

静态内部类:在成员内部类的基础上加上一个static关键字就是静态内部类。
静态内部类的特点:

  • 不需要依赖外部类。
  • 不能使用外部类的非静态属性和方法。

静态内部类实例:

public class Person{
    public void eat(){}
    public static class DoWork implements Work{}
}

你可能感兴趣的:(Java基础知识,Java基础面试题)