标签: inner-classes

为什么 java.util.ArrayList 包中的数据数组是私有的?

java.util.ArrayList类中,列表元素的对象数组被定义为包私有:

transient Object[] elementData; // non-private to simplify nested class access
Run Code Online (Sandbox Code Playgroud)

评论指出,这个字段不是私有的原因是在嵌套类中更容易访问。但是,嵌套类可以很好地访问封闭类的私有数据。那么为什么elementData不是私有的呢?后台是否发生了某些事情(例如,在编译时)?

java visibility arraylist inner-classes

25
推荐指数
2
解决办法
608
查看次数

java如何实现内部类闭包?

在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 closures inner-classes

24
推荐指数
2
解决办法
4934
查看次数

为什么匿名类不能直接实现多个接口?仅仅因为语法还是有其他原因?

在那里有一个内部问题,为什么java匿名类不能同时实现和子类?或者只是因为语法?

java anonymous-class inner-classes

24
推荐指数
4
解决办法
6769
查看次数

如果内部类扩展外部类,内部类的不同成员行为?

今天我偶然发现了一些奇怪的内部(非静态)类行为.

如果我有以下课程......

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)

java inheritance inner-classes

24
推荐指数
3
解决办法
870
查看次数

为什么使用方法本地抽象内部类

可以与方法本地内部类一起使用的合法修饰符之一是abstract.

例如:

public class Outer {
    public void method(){
        abstract class Inner{
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

你有实际使用它的情况吗?

你必须知道SCJP考试.

java abstract-class inner-classes

23
推荐指数
4
解决办法
3787
查看次数

内部类的用法

我可以理解内部类是什么以及如何编写程序.我的问题是程序员在什么情况下真的需要内部课程?

java inner-classes

22
推荐指数
1
解决办法
4058
查看次数

由于某些中间构造函数调用,没有可用的PerfHelper类型的封闭实例

考虑以下代码:

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类型的封闭实例"

我的问题是我可以像上面那样扩展内部类吗?

java abstract inner-classes

22
推荐指数
2
解决办法
2万
查看次数

在java中清空匿名内部类

我正在调查Guava图书馆,我遇到了一个空洞的匿名内部课程TypeToken.

TypeToken<List<String>> stringListTok = new TypeToken<List<String>>() {};
Run Code Online (Sandbox Code Playgroud)

什么是空匿名内部类的确切使用以及哪些有用的场景可以提供帮助?

java anonymous-class inner-classes guava

22
推荐指数
2
解决办法
1162
查看次数

为什么可序列化的内部类不可序列化?

以下代码:

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关键字存在的原因.

java serialization inner-classes

21
推荐指数
1
解决办法
3万
查看次数

从内部嵌套枚举访问外部类

有办法进入外面吗?

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)

java android closures scope inner-classes

21
推荐指数
3
解决办法
6415
查看次数