内部类可以分为四种

  1. 成员内部类(类内部定义的类,非static)
  2. 局部内部类(方法内部的类)
  3. 匿名内部类(抽象类的单次实现并创建实例)
  4. 静态内部类(类内部的static类)

    成员内部类

    一定要创建外部类的实例,通过外部类的实例才能创建成员内部类。 根据这个原理,就能够考虑到,内部类的实例能够访问外部类的所有属性和方法,包括private

  1. class Outter{
  2. private double x = 0;
  3. public Outter(double x){
  4. this.x = x;
  5. }
  6. class Inter{
  7. public void say(){
  8. System.out.println("x=" + x);
  9. }
  10. }
  11. }
  12. // 特点:成员内部类可以无条件的访问外部类的所有成员属性和成员方法(包括private成员和静态成员)。
  13. // 注意:当成员内部类拥有和外部类同名的成员变量或者方法时,会发生隐藏现象,即默认情况下访问成员内部类的成员。如果要访问外部类的同名成员,需要以下面的形式进行访问:
  14. // 外部类.this.成员变量
  15. // 外部类.this.成员方法
  16. // 外部使用成员内部类:
  17. Outter outter = new Outter();
  18. Outter.Inner inner = outter.new Inner();

局部内部类

即定义在一个方法或者一个作用域里面的类,局部内部类的访问仅限方法内或作用域内 因为局部内部类是在一个方法里面的,也就不要有public、protected、pribate、static 的修饰了。

  1. 案例:
  2. class Person{
  3. public Person(){
  4. }
  5. }
  6. class Man{
  7. public Man(){
  8. }
  9. public People getPeeson(){
  10. class Student extends People{
  11. int age = 0;
  12. }
  13. return new Student();
  14. }
  15. }
  16. // 注意:局部内部类不能用public、protected、pribate、static修饰。

匿名内部类

1、使用匿名内部类时,我们必须是继承一个类或者实现一个接口,但是两者不可兼得,同时也只能继承一个类或
者实现一个接口。
2、匿名内部类中是不能定义构造函数的。
3、匿名内部类中不能存在任何的静态成员变量和静态方法。
4、匿名内部类为局部内部类,所以局部内部类的所有限制同样对匿名内部类生效。
5、匿名内部类不能是抽象的,它必须要实现继承的类或者实现的接口的所有抽象方法。
6、只能访问final型的局部变量

静态内部类

静态内部类不能访问外部类的非static变量或方法。因为静态内部类是通过外部类直接创建的,创建不需要依赖外部类的实例,所以跟踪不到非静态变量和方法。

  1. public class Demo {
  2. public static void main(String[] args) {
  3. Book.Info info = new Book.Info();
  4. info.say();
  5. }
  6. }
  7. public class Book {
  8. // 创建一个静态内部类
  9. static class Info {
  10. public void say() {
  11. System.out.println("这是一个信息类");
  12. }
  13. }
  14. }
  15. 注意:静态内部类不可以访问外部类的非静态资源。如要访问,必须将访问的内容定义成静态形式。
  16. public class Book {
  17. private static String name; // 必须将name变量定义为static类型,下面的静态内部类才可以访问
  18. // 创建一个静态内部类
  19. static class Info {
  20. public void say() {
  21. System.out.println("这是一个信息类" + name);
  22. }
  23. }
  24. }