静态内部类和非静态内部类的区别
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
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);
}
}
}