【笔记】Java内部类

静态内部类和非静态内部类的区别

A non-static nested class has full access to the members of the class within which it is nested. A static nested class does not have a reference to a nesting instance, so a static nested class cannot invoke non-static methods or access non-static fields of an instance of the class within which it is nested.Java: Static vs inner class - Stack Overflow
inner_class

local class不能访问一般的局部变量,只能访问被final修饰的局部变量

local class不能被static修饰, 因为static只能修饰成员变量, 不能修饰局部变量.
local class中可以直接访问外部类的所有成员, 包括私有成员, 因为其默认持有外部类的引用.
但不能访问它所在作用域中的一般的局部变量, 只能访问被final修饰的局部变量.
为什么必须是final的呢? - 崔鹏飞的Octopress Blog
Java的局部内部类以及final类型的参数和变量 - JAVA夜无眠 - ITeye博客

示例代码

package com.zhoujin7;

public class Outer {
  private static String outerStaticField = "Outer Static Field";
  private String outerInstanceField = "Outer Instance Field";

  public Outer() {
    System.out.println("Outer Class");
  }

  public static void staticPrint() {
    final String localField = "local Field";
    class Local {
      public Local() {
        System.out.println("Local Class");
        System.out.println(outerStaticField);
        System.out.println(localField);
      }
    }
    new Local();
  }

  public static void main(String[] args) {
    new StaticMember();
    System.out.println();
    new Outer().new NonStaticMember();
    System.out.println();
    new Outer().print();
    System.out.println();
    Outer.staticPrint();
  }

  public void print() {
    // JDK 8 可以不用加上这个final
    final String localField = "local Field";
    class Local {
      public Local() {
        System.out.println("Local Class");
        System.out.println(outerInstanceField);
        System.out.println(outerStaticField);
        System.out.println(localField);
      }
    }
    new Local();
  }

  public static class StaticMember {
    public StaticMember() {
      System.out.println("Static Class");
      System.out.println(outerStaticField);
    }
  }

  public class NonStaticMember {
    public NonStaticMember() {
      System.out.println("Non-Static Member Class");
      System.out.println(outerInstanceField);
    }
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
备案号: 湘ICP备16015340号