package pkg; class PrivateClasses { private interface Callable { T call(); } private static final Runnable R1 = new Runnable() { @Override public void run() { String s = ""; class NonCapturingLocalR1 { private final String s; public NonCapturingLocalR1(String s) { this.s = s; } @Override public String toString() { return this.s; } } class CapturingLocalR1 { private final int i; public CapturingLocalR1(int i) { this.i = i; } @Override public String toString() { return s + ":" + i; } } new NonCapturingLocalR1(s).toString(); new CapturingLocalR1(42).toString(); Callable c1 = new Callable() { @Override public String call() { return null; } }; Callable c2 = new Callable() { @Override public String call() { return s; } }; (c1.call() + c2.call()).length(); } }; private final Runnable R2 = new Runnable() { @Override public void run() { String s = ""; class NonCapturingLocalR2 { private final String s; public NonCapturingLocalR2(String s) { this.s = s; } @Override public String toString() { return this.s; } } class CapturingLocalR1 { private final int i; public CapturingLocalR1(int i) { this.i = i; } @Override public String toString() { return s + ":" + i; } } new NonCapturingLocalR2(s).toString(); new CapturingLocalR1(42).toString(); Callable c1 = new Callable() { @Override public String call() { return null; } }; Callable c2 = new Callable() { @Override public String call() { return s; } }; (c1.call() + c2.call()).length(); } }; public static void m1(String s) { class NonCapturingLocalM1 { private final String s; public NonCapturingLocalM1(String s) { this.s = s; } @Override public String toString() { return this.s; } } class CapturingLocalM1 { private final int i; public CapturingLocalM1(int i) { this.i = i; } @Override public String toString() { return s + ":" + i; } } new NonCapturingLocalM1(s).toString(); new CapturingLocalM1(42).toString(); Callable c1 = new Callable() { @Override public String call() { return null; } }; Callable c2 = new Callable() { @Override public String call() { return s; } }; (c1.call() + c2.call()).length(); } public void m2(String s) { class NonCapturingLocalM2 { private final String s; public NonCapturingLocalM2(String s) { this.s = s; } @Override public String toString() { return this.s; } } class CapturingLocalM2 { private final int i; public CapturingLocalM2(int i) { this.i = i; } @Override public String toString() { return s + ":" + i; } } new NonCapturingLocalM2(s).toString(); new CapturingLocalM2(42).toString(); Callable c1 = new Callable() { @Override public String call() { return null; } }; Callable c2 = new Callable() { @Override public String call() { return s; } }; (c1.call() + c2.call()).length(); } }