在java.util.ArrayList类中,列表元素的对象数组被定义为包私有:
transient Object[] elementData; // non-private to simplify nested class access
Run Code Online (Sandbox Code Playgroud)
评论指出,这个字段不是私有的原因是在嵌套类中更容易访问。但是,嵌套类可以很好地访问封闭类的私有数据。那么为什么elementData不是私有的呢?后台是否发生了某些事情(例如,在编译时)?
在Java中,匿名内部类可以引用其本地范围中的变量:
public class A {
public void method() {
final int i = 0;
doStuff(new Action() {
public void doAction() {
Console.printf(i); // or whatever
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是这是如何实际实现的?如何i进入匿名内部doAction实现,为什么必须这样做final?
在那里有一个内部问题,为什么java匿名类不能同时实现和子类?或者只是因为语法?
今天我偶然发现了一些奇怪的内部(非静态)类行为.
如果我有以下课程......
class B {
String val = "old";
void run(){
val = "new";
System.out.println(val); // outputs: new
new InnerB().printVal(); // outputs: new
}
private class InnerB {
void printVal(){ System.out.println(val); }
}
}
new B().run();
Run Code Online (Sandbox Code Playgroud)
......一切似乎都很清楚.InnerB的实例属于B的实例,因此如果它应该输出val,则打印已经替换的值'new'.
但是如果内部类扩展了外部类,则这不起作用.
class B {
String val = "old";
void run(){
val = "new";
System.out.println(val); // outputs: new
new InnerB().printVal(); // outputs: new
new InheritedB().printVal(); // outputs: old new
}
private class InnerB {
void printVal(){ System.out.println(val); }
}
private class InheritedB extends B{ …Run Code Online (Sandbox Code Playgroud) 可以与方法本地内部类一起使用的合法修饰符之一是abstract.
例如:
public class Outer {
public void method(){
abstract class Inner{
}
}
}
Run Code Online (Sandbox Code Playgroud)
你有实际使用它的情况吗?
你必须知道SCJP考试.
考虑以下代码:
class abstract Normal1 extends Something
{
}
class Outer
{
class abstract Inner extends Normal1
{
}
}
class General extends Outer.Inner // Problem occurs at this
{
}
Run Code Online (Sandbox Code Playgroud)
我得到的错误是"由于一些中间构造函数调用,没有可用的PerfHelper类型的封闭实例"
我的问题是我可以像上面那样扩展内部类吗?
我正在调查Guava图书馆,我遇到了一个空洞的匿名内部课程TypeToken.
TypeToken<List<String>> stringListTok = new TypeToken<List<String>>() {};
Run Code Online (Sandbox Code Playgroud)
什么是空匿名内部类的确切使用以及哪些有用的场景可以提供帮助?
以下代码:
public class TestInnerClass {
public static void main(String[] args) throws IOException {
new TestInnerClass().serializeInnerClass();
}
private void serializeInnerClass() throws IOException {
File file = new File("test");
InnerClass inner = new InnerClass();
new ObjectOutputStream(new FileOutputStream(file)).writeObject(inner);
}
private class InnerClass implements Serializable {
private static final long serialVersionUID = 1L;
}
}
Run Code Online (Sandbox Code Playgroud)
抛出以下异常:
Exception in thread "main" java.io.NotSerializableException: TestInnerClass
Run Code Online (Sandbox Code Playgroud)
我猜内部类有一个TestInnerClass.this字段允许私有访问TestInnerClass的字段和方法.声明内部类静态可以解决它,但是如果InnerClass需要这种访问呢?有没有办法在没有封闭类的情况下序列化非静态内部类,例如通过引用外部类transient?
编辑:例如,只有在序列化之前才需要访问外部类.好的,编译器无法知道,但我认为这就是transient关键字存在的原因.
public class OuterClass {
String data;
public void outerMethod(String data) {
this.data = data;
}
public enum InnerEnum {
OPTION1("someData"),
OPTION2("otherData");
InnerEnum(String data) {
// Does not work:
OuterClass.this.outerMethod(data);
}
}
}
Run Code Online (Sandbox Code Playgroud) inner-classes ×10
java ×10
closures ×2
abstract ×1
android ×1
arraylist ×1
guava ×1
inheritance ×1
scope ×1
visibility ×1