首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >内部类具有对外部类的隐式引用,可能会泄漏内存。

内部类具有对外部类的隐式引用,可能会泄漏内存。
EN

Stack Overflow用户
提问于 2015-03-01 01:56:45
回答 1查看 3.2K关注 0票数 7

在了解了内部类之后,我知道它有一个对外部类的隐式引用。

但是我的老师告诉我,最好的方法是不要使用内部类,更喜欢使用静态的内部类。因为内部类可能会泄漏内存。

有人能解释一下这件事吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-01 11:37:23

在你的评论的答案(如果我张贴在评论中它将是不可读的),它属于哪里。外部添加内部类的示例。

代码语言:javascript
运行
复制
public class Dog {
    String name;
}

public class HugeKennel {
    Double[] memmoryWaste = new Double[10000000];


    public List<Dog> getDogs() {
        SneakyDog trouble = new SneakyDog("trouble");
        return Arrays.asList(trouble);
    }

    class SneakyDog extends Dog {
        SneakyDog(String name) {
            this.name = name;
        }
    }

}

代码中的其他地方

代码语言:javascript
运行
复制
List<Dog> getCityDogs() {
    List<Dog> dogs = new ArrayList<>();
    HugeKennel k1 = ...
    dogs.addAll(k1.getDogs());
    HugeKennel k2 = ...
    dogs.addAll(k2.getDogs());
    return dogs;
}

....

List<Dog> cityDogs = getCityDogs();
for (Dog dog: dogs) {
    walkTheDog(dog);
}
// even though the Kenels were local variables in of getCityDogs(), they cannot be removed from the memory, as the SneakyDogs in the list are still referencing their parent kennels.
//from now on, until all the dogs are not disposed off, the kennels also have to stay in the memory.

因此,您不需要通过parrent类访问内部类,一旦创建了内部对象,它就可以作为任何其他对象使用,并且可以“泄漏”它的容器类,例如在上面的示例中,当狗列表将保存对狗的引用时,每个狗仍然会“知道”它的狗舍。

当innner类作为匿名内部类创建'ad‘时,来自StackTrace的链接示例与典型的用例相关,但问题是相同的。如果传递对内部类的任何实例的引用,则也是对外部类的“传递”引用。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28789234

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档